findAndModify MongoDB插入元素在数组的开头

时间:2014-09-21 04:27:04

标签: node.js mongodb mongoose

更新: 这里的问题是本机MongoDB驱动程序需要与Mongoose不同格式的objectID。而不是我需要做的{_id:story_id},{_ id:new mongoose.Types.ObjectId(story_id)}。它只返回两个字段的原因是它创建了一个带有{_id:story_id}的新文档,而不是更新{_id:{$ oid:story_id}}的文档。但是,我原来的驱动程序与mongoose这样做的原因结果证明不起作用。即使是本机驱动程序也不接受正$ slice值。所以我仍在寻找一种方法,使用Mongoose或通过Mongoose访问的本机驱动程序(不支持$ position或正$ slice值)将对象插入数组的开头。

当我运行下面的查询时,返回的结果只包括_id,消息和参与者。我希望得到完整的故事记录,而不仅仅是更新的字段。有没有办法做到这一点?基于Node MongoDB Native驱动程序文档(http://mongodb.github.io/node-mongodb-native/api-generated/collection.html#findandmodify)"字段"来自mongo控制台的参数未在findAndModify驱动程序中实现。我想避免必须进行第二次查询才能获得刚刚更新的记录。

Story.collection.findAndModify(
{"_id": story_id},
{"_id": "asc"},
{ 
    "$push": {
"messages": {
  "$each": [message],
  "$sort": { "_id": -1},
  "$slice": 500 
    },
  },
    "$addToSet": {"participants": user_id},
},
    {new: true},
    {fields: {"feeling":1, "description":1, "image_height":1, "image_width":1, "storyteller":1, "image_url":1, "participants":1}},   // -> this line is ignored by MongoDB native driver

      {upsert: true}

)

1 个答案:

答案 0 :(得分:2)

您可以使用$push使用$each$position修饰符(Mongoose支持)在数组字段的开头插入元素:

Story.findByIdAndUpdate(story_id, {
    $push: {
      messages: {
        $each: [message],
        $position: 0
      },
    },
    $addToSet: {participants: user_id},
  }, {
    new: true,
    upsert: true
  },
  function (err, newDoc) { ... }
);