Обновление и возврат документа в 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 })
Если вы хотите обновить результаты, выполните другой запрос с помощью первичного ключа.