#javascript #node.js #mongodb
#javascript #node.js #mongodb
Вопрос:
Я хочу просто обновить два поля, используя два критерия в методе updateOne. Допустим, я получил такой документ:
{ "_id" : ObjectId("123"), "name" : "someName", "text" : "someText", "date" : "someDay"}
Тогда у меня есть функция, которая отвечает за это обновление:
static async updateSomething( id , someName, newText, newDate) {
try {
const updateResponse = await collection.updateOne(
{ _id: ObjectId(id), name: someName },
{ $set: { text: newText, date: newDate} },
)
console.log( id, someName, newText, newDate );
console.log(updateResponse.matchedCount);
console.log(updateResponse.modifiedCount);
return **updateResponse**
} catch (e) {
console.error(`Unable to update comment: ${e}`)
return { error: e }
}
}
Затем, когда я, наконец, вызываю эту функцию с:
updateSomething( 123, "someName", "new text that i want", "new date that i want")
Мой первый журнал подтверждает, что данные совпадают, но следующие два журнала возвращают 0.
И ничего не было обновлено.
Кто-нибудь знает, о чем это? Я искал в документах, синтаксис выглядит хорошо, я искал ответ где-нибудь еще, не нашел этого случая.
Комментарии:
1. Ваш синтаксис в порядке, если
updateResponse.matchedCount
равно 0, то, очевидно, раздел запроса вашего обновления не соответствует документу так, как вы ожидаете. Мы не можем отладить это для вас, не видя документ в базе данных и значения, которые вы фактически передаете. Независимо от того, я рекомендую вам начать с выполнения всех основных проверок работоспособности. (убедитесь, что нужный элемент существует в запрашиваемой вами коллекции и т. Д.)2. Вы были правы, не было документа, соответствующего этому запросу. Одно из этих полей было объектом, поэтому вместо запроса: name: someName я должен был запросить: «object.name «: Какое-то имя.
Ответ №1:
//actual code output from the mongo shell
//you need to remove Object ID in the command and run the below code. it returns //matchedCount and modifiedCount correctly
> db.test4.find();
{ "_id" : "123", "name" : "someName", "text" : "someText", "date" : "someDay" }
> db.test4.updateOne(
... {_id: "123", name:"someName"},
... {$set:{text:"new Text", date: "new Date"}}
... );
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.version();
4.2.6
>