Помилка: документ операції оновлення повинен містити атомарні оператори під час запуску 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: Повне керівництво по роботі з великими даними». Еелко Плугге, Девід Хоуз, Пітер Мембрі, Тім Хокінс

Мій 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.