javascript - 使用 Angularjs 和 Mongoose 进行无限滚动 - 性能

标签 javascript node.js mongodb mongoose mongodb-query

我有一个图像列表,这些图像是我使用 Mongoose 和 Expressjs 使用 $http.get() 从 MongoDB 中通过 Angular 获取的。

我所做的工作正常,但我对性能有疑问。

到目前为止我找到了两种方法:

  • 使用跳过
  • 使用$nin

查询如下所示:

    // Using $nin:
    var skip = req.query.skip || [];

    User.find({ _id : { $nin: skip }})
    .sort({ _id: -1 })
    .limit(15)
    .exec(function(err, users) {
    if (err) res.json({ 'msg': 'Error loading users' });
    res.json({
      users: users
    });
  });

和:

    // Using skip
    User.find({})
    .sort({ _id: -1 })
    .skip(15)
    .limit(15)
    .exec(function(err, users) {
    if (err) res.json({ 'msg': 'Error loading users' });
    res.json({
      users: users
    });
  });

谷歌搜索似乎使用skip一段时间后性能缺乏......

但是查看 $nin 选项,我在滚动和滚动一个很长的查询后发现......有大量 _id...

这 2 种解决方案应该使用哪一种更好?

或者还有第三种方法比这些更好,也许我做错了什么?

谢谢

最佳答案

理想情况下,您想使用 $nin包含之前看到的 _id 值的列表,但将其与 $gte 结合起来或$lte (取决于顺序)您正在排序的内容的运算符。

大多数“以其他方式排序的查询”通常都是这种情况,但如果 _id 字段是您要排序的字段(并且按降序排列),那么它就变成了一个问题与 $lt 合作查找小于上一页“最后看到的值”的值。

因此,在迭代时,将最后一项的“最后看到的值”存储在“页数限制”结果中,然后使用 $lt后续查询中的运算符:

即:

var lastSeen = null; // declare in a global or session or something

User.find({})
    .sort({ "_id": -1 })
    .limit(15)
    .exec(function(err,docs) {
        lastSeen = docs.slice(-1).id;
    });

然后:

User.find({ "_id": { "$lt": lastSeen })
    .sort({ "_id": -1 })
    .limit(15)
    .exec(function(err,docs) {
        lastSeen = docs.slice(-1).id;
    });

关于javascript - 使用 Angularjs 和 Mongoose 进行无限滚动 - 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862213/

相关文章:

javascript - href 中的 $scope - AngularJS

javascript - 与 node.js 的 SSL 连接

node.js - 如果我将模块发布到 npm,fs 无法获取文件

node.js - 在node.js-mongodb中分组

javascript - 使用 jasmine-node 监视全局函数

javascript - 使用 javascript 和 ajax 将多个对象发送到 php

node.js - 如何在更新 Mongoose 上推送对象数组

node.js - 更新 MongoDB 文档(在 NodeJS 中)

javascript - 如何正确编码/调试复杂的 bool 条件

使用 Windows 凭据的 Node.js Websocket