Ошибка: документ операции обновления должен содержать атомарные операторы, при запуске updateOne
В моей коллекции только один документ.
> 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 :
[email protected]/mongo/shell/crud_api.js:493:1
@(shell):1:1
Второй и третий аргументы в приведенной выше команде взяты из примера в "Полном руководстве по MongoDB: полное руководство по работе с большими данными..." (Eelco Plugge, David Hows, Peter Membrey, Tim Hawkins).
У меня MongoDB 3.2.
Ответы
Ответ 1
Неверный синтаксис для второго параметра. Проверьте документы. Это должно быть:
db.c20160712.updateOne(
{ "Attribute" : "good" },
{ $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
{ upsert: true }
);
Ответ 2
Я полагаю, что это было изменено как побочный эффект от введения updateOne()
в дополнение к update()
и updateMany()
качестве некоторой меры защиты от случайного переопределения пользователем всего документа.
Вместо этого вы можете использовать метод replaceOne()
или update()
без указания multi:true
.
Ответ 3
Вы должны использовать этот код, потому что я столкнулся с той же проблемой, а затем я использовал этот код:
updateOne(
{ _id: new ObjectID(req.params.id) },
{ $set: { title: req.body.bookName, author: req.body.authorName } },
{ upsert: true }
)
и вы также должны определить ObjectID
иначе проблема возникнет снова....
const ObjectID = require('mongodb').ObjectID;