2016-11-24 2 views
3

Что я хочу:findOneAndUpdate возвращает null при вставке?

  1. возвращение 1 если вставка преуспевает, даже если документ не существует раньше.
  2. возвращение 1 если обновление успешно

Но я не могу этого добиться с findOneAndUpdate, который только возвращает результат, если документ существует и успешно обновлен.

Мой запрос:

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

Посмотрите на документацию [** 'WriteResult' **] (https://docs.mongodb.com/manual/reference/method/WriteResult/). – chridam

ответ

0

Предполагая, что вы хотите, чтобы результат обновленный документ, вам нужно изменить ваш запрос, чтобы выглядеть следующим образом:

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

Свойство returnNewDocument сделает обратный вызов верните обновленный документ вместо оригинала. В случае повышения в несуществующем документе он вернет новый документ вместо пустого набора.

1

Вы можете получить доступ к родному драйверу для вызова базовой коллекции в updateOne() или updateMany() метода, который будет возвращать полный ответ от Монго в 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.nModified и result.upsertedCount свойства, чтобы сделать выше вызова.

Смежные вопросы