从背面穿过Mongoose Array,使用SKIP

时间:2014-09-17 05:04:05

标签: node.js mongodb mongoose mongodb-query

有没有办法从数组后面遍历MongoDB / Mongoose中的查询结果?

我有一个Story架构,其中消息是架构中的数组元素。

我能做到

    Story.findById(story_id, { messages: { $slice: -limit  } } )  

OR

       .where('messages').slice(-limit)

从数组末尾获取限制元素。但是,我想要做的是跳过N个元素(从最后开始)并获取 limit 元素。即一次遍历整个数组 limit

我尝试使用skip()以及将数组传递给slice()(即slice([skip,limit]),但是它似乎正在寻找跳过的正值(即从数组的开头开始的位置,而不是从最后)。

有直接的方法吗?

我需要的是来自跳过限制元素远离数组的 end

1 个答案:

答案 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将限制要返回的项目数。