updateOne возвращает «matchedCount»: 0, «modifiedCount»: 0

#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
>