Javascript 如何将Mongoose排序查询偏移到特定文档之后开始
我目前有以下查询返回给定Javascript 如何将Mongoose排序查询偏移到特定文档之后开始,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我目前有以下查询返回给定状态的最新更新帖子的计数 var query = Post.find() .where('status').equals(status) .sort('-updated') .limit(count); 如果状态为“已批准”且计数为3,则我的结果如下所示: [ { "id": "test1", "updated": "2015-11-30T16:51:54.988Z", "status": "approved", }, {
状态的最新更新帖子的计数
var query = Post.find()
.where('status').equals(status)
.sort('-updated')
.limit(count);
如果状态
为“已批准”且计数
为3,则我的结果如下所示:
[
{
"id": "test1",
"updated": "2015-11-30T16:51:54.988Z",
"status": "approved",
},
{
"id": "test2",
"updated": "2015-11-30T16:51:52.125Z",
"status": "approved",
},
{
"id": "test3",
"updated": "2015-11-30T16:51:50.469Z",
"status": "approved",
}
]
我需要能够指定一个id
来抵消我的结果
例如,如果状态
为“已批准”,计数
为2,偏移id为“test1”,则结果应为:
[
{
"id": "test2",
"updated": "2015-11-30T16:51:52.125Z",
"status": "approved",
},
{
"id": "test3",
"updated": "2015-11-30T16:51:50.469Z",
"status": "approved",
}
]
因此,我按更新的属性排序,但结果应仅从偏移id之后的文档开始。您不能按特定id进行偏移,但可以使用skip()
跳过一定数量的文档
我想排除您不需要跳过的id,没有其他解决方案:
var query = Post.find({
$and: [{
status: status
}, {
id: {
$nin: ['test1']
}
}]
})
.sort('-updated')
.limit(count);
使用$nin
可以通过使用如下id数组排除多个id
:['test1','test2','etc..。]
您应该从query@Michelem我只是以test1为例,这将需要对任何文档起作用,这意味着排除在我想要的日期之前更新的所有ID。我并不总是知道它们是什么,因为它们一直在被添加。谢谢你的回答,但我认为它们不会提供可靠的结果。使用skip()。第二种方法不起作用,因为。limit(count)
将返回我需要的帖子数量。我必须查询整个集合,以确保我可以跳到所需的文档并返回正确的金额。不幸的是,这不起作用,因为我需要排除在我想要的日期之前更新的所有ID。我不能保证我会知道它们是什么,因为它们一直在添加。我认为你需要检查你的应用程序的逻辑,因为我认为你做得不好。我认为你是对的,看起来我应该用更新的属性而不是特定的文档来抵消。类似于where('updated').gt(aDateObject)
。我会把这个标记为正确的,因为它似乎是你能得到的最接近标题所要求的。
var query = Post.find()
.where('status').equals(status)
.sort('-updated')
.limit(count);
var offsetId = 'test1';
var filteredDocs = [];
query.exec().then(function (docs) {
var skipped = true;
docs.forEach(function (doc) {
if (skipped && doc.id == offsetId) skipped = false;
if (!skipped) filteredDocs.push(doc);
});
});
var query = Post.find({
$and: [{
status: status
}, {
id: {
$nin: ['test1']
}
}]
})
.sort('-updated')
.limit(count);