【发布时间】:2015-11-22 11:52:27
【问题描述】:
Chatrooms.findOneAndUpdate({Roomname: room.Roomname},{ $setOnInsert: {status: true, userNum: 1}}, {new: true, upsert: true}, function(err, doc) {
if(err) console.log(err);
console.log("DOC " + doc)
if(doc.status) {
// FOUND ROOM SATTUS IS TRUE LOGIC
console.log(doc);
// return callback(true)
}
});
上面的查询将返回给我更新或插入的实际文档,但我无法准确检查它是哪一个。如果我进行更新而不是 findOneandUpdate 我会返回这个
{
ok: 1,
nModified: 0,
n: 1,
upserted: [ { index: 0, _id: 55df883dd5c3f7cda6f84c78 } ]
}
如何同时返回文档和写入结果,或者至少返回写入结果中的 upserted 字段。
【问题讨论】:
-
如果它是“upserted”,那么文档中唯一可能存在的内容就是您在操作中发送的内容。在这种情况下,“RoomName”、“status”和“userNum”字段以及您在此处指定的所有内容。除了您发送的内容之外,唯一可能创建的是
_id值。所以这就是为什么那是唯一返回的东西。理解?您不需要返回任何东西,因为您已经拥有所有值。 -
对,但是对于 findOneAndUpdate 如果我说 new:true ,是否无法区分返回的文档是插入还是找到?但是,如果我不包括 new:true 那么在这种情况下 doc 将在找不到 doc 时返回 null 然后我假设它已插入但我想知道是否有更好的方法来查看它
-
你显然不明白。再读一遍我说的话。您发送三个字段的值,您会被告知创建了一个新文档以及该文档的新 _id。除了您要求它设置的值之外,不会创建其他字段。您已经知道这些值,因此返回仅包含这些值的文档是没有意义的。这就是它的工作原理。
-
我没有得到仅用于更新的 findOneAndUpdate 的写入结果对象 我想知道如何将 findOneAndUpdate 与文档一起获取。
-
但我认为这是不可能的
标签: node.js mongodb mongoose mongodb-query