Node.js findAndModify MongoDB在数组开头插入元素
更新: 这里的问题是,本机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”参数。我希望避免进行第二次查询以获取刚刚更新的记录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}的文档。然而,我最初使用原生驱动程序与猫鼬进行此操作的原因被证明不起作用。即使本机驱动程序也不接受正
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) { ... }
);