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.

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 }
);

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.


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;

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} 
)

6
Was ist der Syntaxunterschied?
Baruchiro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.