.updateOne на MongoDB не работает в Node.js

У меня есть следующий код:

connection((db) => {
            db.collection('orders')
                .updateOne(
                    { "_id": req.body._id}, // Filter
                    {"name": req.body.name} // Update
                )
                .then((obj) => {
                    console.log('Updated - ' + obj);
                    res.redirect('orders')
                })
                .catch((err) => {
                    console.log('Error: ' + err);
                })
        })

Я хочу изменить имя в заказе, но он не обновляет его. Результат в консоли:

Updated - {"n":0,"nModified":0,"ok":1}

Я попытался прочитать документацию, но это ужасно

EDIT: {$set: {"name": req.body.name}}, не работает

EDIT 2: Пропущенный идентификатор соответствует _id в базе данных. Может быть, проблема в том, что я запрашиваю простой текстовый идентификатор, в то время как в базе данных он называется "ObjectId (" 5a42ja... ")

Ответ 1

Может быть, вы должны использовать "$ set" в своем запросе на обновление следующим образом:

{$set: {"name": req.body.name}}, // Update

Больше информации в документации

РЕДАКТИРОВАТЬ

Если это не сработает, возможно, это связано с отсутствием соответствия с вашим фильтром.

Может быть, вы должны попытаться сопоставить ObjectId следующим образом:

var ObjectID = require('mongodb').ObjectID;

// In your request
{ "_id": ObjectID(req.body._id)}, // Filter

Надеюсь, поможет.

Ответ 2

Используйте {$set: {"name": req.body.name}} (как упомянуто Sparw) для обновления свойств, которые вы хотите в документе. Кроме того, если идентификатор, который вы передаете в качестве параметра, в коллекции не существует (и вы хотите создать его с тем же идентификатором), вы можете передать его в качестве третьего параметра {upsert: true} чтобы создать его.

В вашем примере:

connection((db) => {
          db.collection('orders')
               .updateOne(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

Ответ 3

Трудный ответ @Spraw подходит для некоторых случаев, но иногда он не работает. Я думаю, что удобный ответ - updateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback).

_id в mongodb является BSON объект и должен быть создан.

Ответ 4

Для меня я должен удалить поле "_id"/id перед передачей объекта в обновлении.

Или это скажет, что поле недействительно.

Очевидно, что обновлять ключ, пока вы используете его в качестве справочного материала, - не лучшая вещь.

Ответ 5

Слишком поздно, но для новичков или студентов, изучающих nodejs с помощью mongodb. вместо метода updateOne просто используйте метод update.

connection((db) => {
          db.collection('orders')
               .update(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })