首页 文章

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

提问于
浏览
1

更新:这里的问题是本机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控制台中的"fields"参数未在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 回答

  • 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) { ... }
    );
    

相关问题