findOneAndUpdate在插入时返回null?

时间:2016-11-24 14:35:32

标签: node.js mongodb mongoose

我想要的是:

  1. 如果插入成功,即使文档之前不存在,也会返回1
  2. 如果更新成功则返回1
  3. 但我似乎无法通过findOneAndUpdate实现此目的,User.findOneAndUpdate( { email: email }, { $set: { verified: 1 } }, { upsert: true } ).exec(callback); 仅在文档存在且成功更新时才返回结果。

    我的查询:

    $this->get($url, $headers);
    

2 个答案:

答案 0 :(得分:1)

您可以访问本机驱动程序来调用基础集合的 updateOne() updateMany() 方法,该方法将返回Mongo的完整响应。 updateWriteOpCallback 回调为您可以使用的 updateWriteOpResult 对象。例如

User.collection.updateOne(
    { "email": email },
    { "$set": { "verified": 1 } },
    { "upsert": true },
    function(err, result) {

        // The number of documents that matched the filter.
        console.log(result.matchedCount); 

        // The number of documents that were modified.    
        console.log(result.modifiedCount);  

        // The number of documents upserted.  
        console.log(result.upsertedCount);   

        // The total count of documents scanned. 
        console.log(result.result.n);     

        // The total count of documents modified.
        console.log(result.result.nModified); 
    }
);

在这种情况下,您可能需要检查result.result.nModifiedresult.upsertedCount属性才能进行上述调用。

答案 1 :(得分:0)

假设您希望结果是更新的文档,则需要将查询修改为如下所示:

User.findOneAndUpdate(
  { email: email },
  { $set: { verified: 1 } },
  { upsert: true, returnNewDocument: true }
).exec(callback);

returnNewDocument属性将使回调返回更新的文档而不是原始文档。如果在不存在的文档上进行upsert,它将返回新文档而不是空集。