有没有办法从数组后面遍历MongoDB / Mongoose中的查询结果?
我有一个Story架构,其中消息是架构中的数组元素。
我能做到
Story.findById(story_id, { messages: { $slice: -limit } } )
OR
.where('messages').slice(-limit)
从数组末尾获取限制元素。但是,我想要做的是跳过N个元素(从最后开始)并获取 limit 元素。即一次遍历整个数组 limit 。
我尝试使用skip()以及将数组传递给slice()(即slice([skip,limit]),但是它似乎正在寻找跳过的正值(即从数组的开头开始的位置,而不是从最后)。
有直接的方法吗?
我需要的是来自跳过的限制元素远离数组的 end 。
答案 0 :(得分:0)
正如所说的那样,真正的解决方案就是将数据存储到目前的方式,这基本上是将项目附加到最后。
从MongoDB 2.6及更高版本开始,您可以将$position
修饰符用于数组的基本"pre-pend"个项目:
Story.update(
{ "_id": story_id },
{ "$push": {
"messages": {
"$each": elementsAsArray,
"$position": 0
}
}},
function(err,numAffected) {
}
);
即使添加单个元素,也需要使用$each
修饰符进行调用。
否则你可以应用$sort
修饰符,但有一些东西可以用来排序"排序"因此,元素实际上是有序的。所以可能是一个"修改过的"日期字段:
Story.update(
{ "_id": story_id },
{ "$push": {
"messages": {
"$each": elementsAsArray,
"$sort": { "modified": -1 },
"$slice": 100
}
}},
function(err,numAffected) {
}
);
对于MongoDB 2.6之前的版本,还需要$slice
修饰符,但您可以将其设置为大于预期在数组中的元素数的数字。或者实际上使用它以限制"数组可能有多大。
你甚至可以注意到"提示"在$sort
文档:
" TIP 您可以将空数组[]传递给$ each修饰符,以便只有$ sort修饰符才有效。"
这样可以用来批量更新现有的项目,其中确实有一个"子字段"可以排序。
完成此操作后,投影的$slice
运算符将根据需要运行。 skip
将通过数组转发的位置limit
将限制要返回的项目数。