【问题标题】:Meteor js: The page taking too much time to query with mongodb if records are around 100000Meteor js:如果记录在100000左右,则使用mongodb查询页面花费太多时间
【发布时间】: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


【解决方案1】:

让 mini-mongodb 填充如此庞大的数据并不是一个好习惯。虽然 Meteor JS 在这方面也很擅长,但考虑到网络流量、带宽等,仍然需要一些时间。

不管是无限滚动还是简单分页我都建议你使用分页。我已经接受了它,它就像魅力一样,here is the answer and entire code for pagination

我的分页解决方案是特定于服务器的,因此效果很好。集合发布仅限于订阅提供的limit

注意:对于具有搜索和分页功能以及更多功能的表格,还没有这样适当的完整解决方案,这使得它可以根据我们的需要非常灵活。我建议创建自己的。

更多见解:

https://www.quora.com/Does-Meteor-work-well-with-large-datasets

https://forums.meteor.com/t/very-big-data-collection-in-mongodb-how-to-fetch-in-meteor-js/6571/7

https://projectricochet.com/blog/top-10-meteor-performance-problems

【讨论】:

  • 感谢您的回答。现在我一次只能从集合中获取 20 条记录。现在它工作得很好。但是,当我只更新这 20 条记录中的一条记录时,它需要相同的时间来更新该记录。
  • 如果您觉得上面的回答对您有帮助,您能接受吗?并发布您的订阅,发布分页代码。我绝对可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2019-11-14
  • 2012-09-03
  • 2013-07-11
  • 2017-09-24
相关资源
最近更新 更多