Błąd: dokument operacji aktualizacji musi zawierać niepodzielne operatory podczas uruchamiania updateOne

87

W mojej kolekcji jest tylko jeden dokument.

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

Chcę pobiec, updateOneaby zastąpić dokument innym. Ale dlaczego tam jest 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

Drugi i trzeci argument w powyższym poleceniu pochodzi z przykładu w The Definitive Guide to MongoDB: Kompletny przewodnik po Big Data ... Autor: Eelco Plugge, David Hows, Peter Membrey, Tim Hawkins

Moja MongoDB to 3.2.

Tim
źródło

Odpowiedzi:

125

Błędna składnia drugiego parametru. Sprawdź dokumenty . Powinno być:

db.c20160712.updateOne(
    { "Attribute" : "good" }, 
    { $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
    { upsert: true }
);
Alex Blex
źródło
Jestem trochę zdziwiony częścią „Nie tylko aktualizuję”. Czego jeszcze oczekujesz od funkcji aktualizacji ?
Alex Blex
3
Masz na myśli „wymienić” dokument? Następnie należy postępować zgodnie z radą @ dyouberg i używać odpowiedniej funkcji.
Alex Blex
31

Uważam, że zostało to zmienione jako efekt uboczny wprowadzenia tej updateOne()metody oprócz update()i updateMany()jako pewnego rodzaju zabezpieczenie przed przypadkowym zastąpieniem całego dokumentu przez użytkownika.

Możesz replaceOne()zamiast tego użyć metody lub update()bez określania multi:true.

dyouberg
źródło
22

Powinieneś użyć tego kodu, ponieważ ja też miałem ten sam problem, a potem użyłem tego kodu:

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

i należy również zdefiniować, w ObjectIDprzeciwnym razie problem wystąpi ponownie.

const ObjectID = require('mongodb').ObjectID;
nagender pratap chauhan
źródło
0

Zrobiłeś ten sam błąd co ja. Po przejrzeniu dokumentów zdałem sobie sprawę, że składnia jest nieprawidłowa. Próbować:

db.c20160712.updateOne( 
   { "Attribute" : "good"}, 
   {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, 
   { upsert: true} 
)
Prasad Naik
źródło
6
Jaka jest różnica w składni?
baruchiro