我有一个图像列表,这些图像是我使用 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/