无限滚动与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; });