无限滚动与Angularjs和猫鼬 - 性能

Infinite scroll with Angularjs and Mongoose - performance

本文关键字:性能 滚动 Angularjs 无限      更新时间:2023-09-26

我有一个使用MongoDB使用MongoDB使用Mongoose和Expressjs的$http.get()获得的图像列表。

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

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

  • 使用skip
  • 使用$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...

两种解决方案中的哪一种应该更好用?

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

谢谢

理想情况下,您希望$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;
    });