更新: 这里的问题是本机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}
)
答案 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) { ... }
);