Обновление и возврат документа в Mongodb

Я хочу получать обновленные документы. Это мой оригинальный код, и он успешно обновляется, но не возвращает документ.

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {
                        res.send({error: err, affected: results});
                        db.close();
                    });

Я использовал функцию toArray, но это дало ошибку "Невозможно использовать writeConcern без предоставленного обратного вызова":

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}).toArray( function(err, results) {
                    res.send({error: err, affected: results});
                    db.close();
                });

Есть идеи?

Ответы

Ответ 1

collection.update() будет сообщать только количество документов, которые были затронуты его собственным обратным вызовом.

Чтобы извлечь документы при изменении, вы можете использовать collection.findOneAndUpdate() вместо этого (ранее .findAndModify()).

collection.findOneAndUpdate(
    { "code": req.body.code },
    { $set: req.body.updatedFields },
    { new: true },
    function (err, documents) {
        res.send({ error: err, affected: documents });
        db.close();
    }
);

Обратите внимание, что он изменит все согласованные документы, где .update() ожидает, что multi: true сделает то же самое.

Примечание. В настоящее время используется драйвер Node.js версии 2.2. В будущих версиях проверьте наличие предупреждений об отказе в документации и используйте вместо них рекомендуемые альтернативы.

Ответ 2

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

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

function findAndUpdateMany(filter, updateOptions) {
  return collection.find(filter).project({_id: 1}).toArray()
    .then(function(matchingIds) {
      filter = {_id: {$in: matchingIds}}
      return collection.updateMany(filter, updateOptions)
    }).then(function() {
      return collection.find(filter).toArray()
    })
}

Ответ 3

Оформить заказ объекта WriteResult:

http://docs.mongodb.org/manual/reference/method/db.collection.update/#writeresults-update

WriteResult result = collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {
                    res.send({error: err, affected: results});
                    db.close();
                });

результат должен иметь что-то вроде:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Если вы хотите обновить результаты, выполните другой запрос с помощью первичного ключа.