Fehler: Das Update-Operationsdokument muss atomare Operatoren enthalten, wenn updateOne ausgeführt wird

82

In meiner Sammlung gibt es nur ein Dokument.

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

Ich möchte ausführen updateOne, um das Dokument durch ein anderes zu ersetzen. Aber warum gibt es das 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

Das zweite und dritte Argument im obigen Befehl stammt aus einem Beispiel im Definitiven Leitfaden für MongoDB: Ein vollständiger Leitfaden für den Umgang mit Big Data ... Von Eelco Plugge, David Hows, Peter Membrey und Tim Hawkins

Meine MongoDB ist 3.2.

Tim
quelle

Antworten:

119

Falsche Syntax für den zweiten Parameter. Bitte überprüfen Sie die Dokumente . Es sollte sein:

db.c20160712.updateOne(
    { "Attribute" : "good" }, 
    { $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
    { upsert: true }
);
Alex Blex
quelle
Ich bin ein bisschen verwirrt über den Teil "Ich aktualisiere nicht nur". Was erwarten Sie noch von der Update- Funktion?
Alex Blex
3
Sie meinen das Dokument "ersetzen"? Dann sollten Sie den Ratschlägen von @ dyouberg folgen und die richtige Funktion verwenden.
Alex Blex
27

Ich glaube, dies wurde als Nebeneffekt der Einführung der updateOne()Methode zusätzlich zu update()und updateMany()als Schutzmaßnahme geändert, um zu verhindern, dass Benutzer versehentlich ein gesamtes Dokument überschreiben.

Sie können replaceOne()stattdessen die Methode oder eine update()ohne Angabe verwenden multi:true.

Dyouberg
quelle
20

Sie sollten diesen Code verwenden, da ich ebenfalls vor dem gleichen Problem stand und dann diesen Code verwendet habe:

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

und Sie sollten auch definieren, ObjectIDsonst tritt das Problem erneut auf.

const ObjectID = require('mongodb').ObjectID;
nagender pratap chauhan
quelle
0

Du hast den gleichen Fehler gemacht wie ich. Beim Durchgehen der Dokumente wurde mir klar, dass die Syntax falsch ist. Versuchen:

db.c20160712.updateOne( 
   { "Attribute" : "good"}, 
   {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, 
   { upsert: true} 
)
Prasad Naik
quelle
6
Was ist der Syntaxunterschied?
Baruchiro