Ошибка: документ операции обновления должен содержать атомарные операторы, при запуске 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;