使用 findOneAndUpdate 时如何检查文档是否被插入或更新?

Sar*_*lla 5 mongoose mongodb node.js mongodb-query

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)
    }
 });
Run Code Online (Sandbox Code Playgroud)

上面的查询将返回给我更新或插入的实际文档,但我无法确切地检查它是哪一个。如果我进行更新而不是 findOneandUpdate 我会返回这个

{
    ok: 1,
    nModified: 0,
    n: 1,
    upserted: [ { index: 0, _id: 55df883dd5c3f7cda6f84c78 } ]
} 
Run Code Online (Sandbox Code Playgroud)

如何从写入结果中返回文档和写入结果或至少返回插入的字段。

Cho*_*ang 5

截至 2019 年 8 月 8 日(Mongoose 版本 5.6.9),要设置的属性是“rawResult”而不是“passRawResult”:

M.findOneAndUpdate({}, obj, {new: true, upsert: true, rawResult:true}, function(err, d) {
    if(err) console.log(err);
    console.log(d);
});
Run Code Online (Sandbox Code Playgroud)

输出:

{ lastErrorObject:
   { n: 1,
     updatedExisting: false,
     upserted: 5d4befa6b44b48c3f2d21c75 },
  value: { _id: 5d4befa6b44b48c3f2d21c75, rating: 4, review: 'QQQ' },
  ok: 1 }
Run Code Online (Sandbox Code Playgroud)

还要注意,结果是作为第二个参数而不是回调的第三个参数返回的。可以通过 d.value 检索文档。


Sar*_*lla 4

好吧,我的主要问题是,我无法获取插入的文档的 _id,而无法检查它是否已更新/找到或插入。不过我了解到您可以生成自己的 ID。

id = mongoose.Types.ObjectId();    
Chatrooms.findOneAndUpdate({Roomname: room.Roomname},{ $setOnInsert: {_id: id, status: true, userNum: 1}}, {new: true, upsert: true}, function(err, doc) {
        if(err) console.log(err);

        if(doc === null) {

           // inserted document logic 
           // _id available for inserted document via id 
        } else if(doc.status) {

         // found document logic 
        }
     });
Run Code Online (Sandbox Code Playgroud)

更新

猫鼬 API v4.4.8

passRawResult:如果为 true,则将来自 MongoDB 驱动程序的原始结果作为第三个回调参数传递。