Node.js findAndModify MongoDB在数组开头插入元素

Node.js findAndModify MongoDB在数组开头插入元素,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,更新: 这里的问题是,本机MongoDB驱动程序需要与Mongoose不同格式的objectID。我需要做的不是{u id:story\u id},而是{u id:newmongoose.Types.ObjectId(story\u id)}。它只返回两个字段的原因是,它正在创建一个带有{{u id:story{u id}的新文档,而不是更新一个名为{{u id:{$oid:story{u id}的文档。然而,我最初使用原生驱动程序与猫鼬进行此操作的原因被证明不起作用。即使本机驱动程序也不接受正

更新: 这里的问题是,本机MongoDB驱动程序需要与Mongoose不同格式的objectID。我需要做的不是{u id:story\u id},而是{u id:newmongoose.Types.ObjectId(story\u id)}。它只返回两个字段的原因是,它正在创建一个带有{{u id:story{u id}的新文档,而不是更新一个名为{{u id:{$oid:story{u id}的文档。然而,我最初使用原生驱动程序与猫鼬进行此操作的原因被证明不起作用。即使本机驱动程序也不接受正的$slice值。因此,我仍然在寻找一种方法,使用Mongoose或通过Mongoose访问的本机驱动程序(不支持$position或正$slice值)将对象插入数组的开头

当我运行下面的查询时,返回的结果只包括_id、消息和参与者。我想取回完整的故事记录,而不仅仅是更新的字段。有办法做到这一点吗?根据节点MongoDB本机驱动程序文档(),findAndModify驱动程序中未实现mongo控制台中的“fields”参数。我希望避免进行第二次查询以获取刚刚更新的记录

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}

)

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


如果你用的是猫鼬,为什么不打电话?无论如何,您应该取回整个文档,而不仅仅是更新的字段。Mongoose findByIdAndUpdate不支持添加到数组的开头,就像我在这里使用$sort和$slice所做的那样(Mongoose查找负$slice值并返回一个错误。此处显示的此查询不会返回整个文档。Mongoose不支持传递$position参数。请参阅:和此处的上次答复。)“mongoose的错误是$each只能与$sort或$sort配对$slice@PraneethWanigasekera当我用Mongoose 3.8.16测试它时,这个bug被标记为,并且工作得很好。如果它工作的话,那就太棒了。我也在使用3.8.16。下面是我在上面代码中得到的错误:{[OperationalError:exception:$每个术语只需要$slice(和可选$sort)作为补码]名称:'OperationalError',消息:'exception:$每个术语仅将$slice(和可选$sort)作为补码,原因:{[MongoError:exception:$每个术语仅将$slice(和可选$sort)作为补码]非常感谢您的帮助。@Pranethwanigasekera
$position
支持是在MongoDB 2.6中添加的。您运行的服务器版本是什么?是的,您是对的。我想这就是问题所在。我认为我无法控制的MongoDB版本是2.4.5。
Story.findByIdAndUpdate(story_id, {
    $push: {
      messages: {
        $each: [message],
        $position: 0
      },
    },
    $addToSet: {participants: user_id},
  }, {
    new: true,
    upsert: true
  },
  function (err, newDoc) { ... }
);