Ошибка: документ операции обновления должен содержать атомарные операторы при запуске updateOne

87

В моей коллекции всего один документ.

> db.c20160712.find()
{ "_id" : ObjectId("57ab909791c3b3a393e9e277"), "Dimension_id" : 2, "Attribute" : "good", "Hour" : "20160712_06", "Frequency_count" : 100 

Хочу запустить updateOneзамену документа на другой. Но почему там Error: the update operation document must contain atomic operators?

> db.c20160712.updateOne( { "Attribute" : "good"}, {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, { upsert: true} )
2016-08-10T16:37:57.089-0400 E QUERY    [thread1] Error: the update operation document must contain atomic operators :
DBCollection.prototype.updateOne@src/mongo/shell/crud_api.js:493:1
@(shell):1:1

Второй и третий аргументы в приведенной выше команде взяты из примера в Полное руководство по MongoDB: полное руководство по работе с большими данными ... Авторы Eelco Plugge, Дэвид Хоус, Питер Мембри, Тим Хокинс

Мой MongoDB - 3.2.

Тим
источник

Ответы:

125

Неправильный синтаксис второго параметра. Пожалуйста, проверьте документы . Должен быть:

db.c20160712.updateOne(
    { "Attribute" : "good" }, 
    { $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
    { upsert: true }
);
Алекс Блекс
источник
Я немного озадачен частью «Я не просто обновляю». Чего еще вы ждете от функции обновления ?
Alex Blex
3
Вы имеете в виду "заменить" документ? Тогда вы должны следовать совету @dyouberg и использовать правильную функцию.
Alex Blex
31

Я считаю, что это было изменено как побочный эффект введения updateOne()метода в дополнение update()и updateMany()как своего рода защита, чтобы предотвратить случайное изменение пользователем всего документа.

Вы можете использовать replaceOne()метод вместо него или update()без указания multi:true.

Дюберг
источник
22

Вы должны использовать этот код, потому что я тоже столкнулся с той же проблемой, а затем я использовал этот код:

updateOne(
    { _id: new ObjectID(req.params.id) },
    { $set: { title: req.body.bookName, author: req.body.authorName } },
    { upsert: true }
)

и вы также должны определить, ObjectIDиначе проблема возникнет снова.

const ObjectID = require('mongodb').ObjectID;
Нагендер Пратап Чаухан
источник
0

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

db.c20160712.updateOne( 
   { "Attribute" : "good"}, 
   {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, 
   { upsert: true} 
)
Прасад Наик
источник
6
В чем разница синтаксиса?
baruchiro