【发布时间】:2014-11-15 08:09:22
【问题描述】:
更新: 这里的问题是本机 MongoDB 驱动程序需要与 Mongoose 不同格式的 objectID。我需要做的不是 {_id:story_id},而是 {_id:new mongoose.Types.ObjectId(story_id)}。它只返回两个字段的原因是它正在使用 {_id:story_id} 创建一个新文档,而不是更新 {_id: {$oid:story_id}} 的文档。但是,我最初使用本机驱动程序与猫鼬进行此操作的原因被证明是行不通的。甚至本机驱动程序也不接受正的 $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}
)
【问题讨论】:
-
如果你在使用 Mongoose,为什么不打电话给
Story.findByIdAndUpdate?无论如何,您应该取回整个文档,而不仅仅是更新的字段。 -
Mongoose findByIdAndUpdate 不支持添加到数组的开头,就像我在这里使用 $sort 和 $slice 所做的那样(Mongoose 查找负的 $slice 值并返回错误。此查询为此处显示的不会返回整个文档。