【发布时间】:2017-08-10 19:27:08
【问题描述】:
我在做meteor js,mongodb数据库里会有海量数据。目前数据库中大约有 50000 条消息。我正在提供我当前正在使用的代码。由于某种原因,应用程序花费了太多时间来呈现或加载数据库中的数据。还有一件事,如果我正在做任何活动,例如就像应用程序再次从数据库中获取消息一样。
Template.messages.helper({
linkMessages() {
var ids = _.pluck(Meteor.user().subscription, '_id');
var messages = Messages.find({ $or: [{ feedId: { $exists: false }, link: { $exists: true } }, { feedId: { $in: ids }, link: { $exists: true } }] }, { sort: { timestamp: 1 }, limit: Session.get("linkMessageLimit") }).fetch();
return messages;
}
})
在 oncreate 方法中调用发布
Template.roomView.onCreated(function() {
const self = this;
Deps.autorun(function() {
Meteor.subscribe('messages', Session.get('currentRoom'), Session.get('textMessageLimit'), {
onReady() {
isReady.messages = true;
if (scroll.needScroll) {
scroll.needScroll = false;
if (scroll.previousMessage) {
Client.scrollToMessageText(scroll.previousMessage);
}
} else {
Meteor.setTimeout(function() {
Client.scrollChatToBottomMsg();
}, 1000)
}
}
});
});
});`
服务器上的发布功能:
Meteor.publish('messages', function(roomId, limit) {
check(roomId, String);
check(limit, Match.Integer);
let query = { $or: [{ link: {$exists: false} }, { feedId: { $exists: false } }] };
const thresholdMessage = Messages.findOne(query, { skip: limit, sort: { timestamp: 1 } });
if (thresholdMessage && thresholdMessage.timestamp) {
query.timestamp = { $gt: thresholdMessage.timestamp };
}
return Messages.find(query, { sort: { timestamp: -1 } });
});
【问题讨论】:
-
$exists不能使用索引。当然,您可以查询比这更有用的东西吗?如果不是,那么您需要重新设计存储数据的方式并使其成为您要查询的字段的“值”,而不是文档中字段的“存在”。 -
感谢您的回复,我试过没有$exists,一个简单的查找查询,仍然需要时间来加载。
-
为什么需要在 UI 上发布所有 50K 记录?
-
不,我不想要 ui 上的 50k 条记录,我通过指定限制一次在 ui 上获取 100 条记录,要找到 100 条记录并将它们呈现在视图中需要时间.
标签: javascript mongodb meteor