无限滚动与Angularjs和mongoose – 性能

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

我做的很好,但对性能有疑问。

到目前为止,我find了两种方法来实现它:

  • 使用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

2个解决scheme中的哪一个应该更好用?

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

谢谢

理想情况下,您希望使用$nin和以前看到的_id值的列表,但将其与$gte$lte (取决于顺序)运算符组合在一起,然后将其sorting。

对于大多数“其他sorting的查询”通常是这种情况,但是在_id字段是您正在sorting的字段(并且以降序排列)的情况下,只需要使用$lt就可以find更less的值比上一页中的“上次看到的值”要大。

所以在迭代时,将“最后看到的值”存储在“页面限制”结果中的最后一个项目中,然后在随后的查询中使用$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; });