Error: el documento de la operación de actualización debe contener operadores atómicos, al ejecutar updateOne

82

En mi colección, solo hay un documento.

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

Quiero correr updateOnepara reemplazar el documento por otro. Pero, ¿por qué está ahí 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

El segundo y tercer argumento en el comando anterior proviene de un ejemplo en The Definitive Guide to MongoDB: Una guía completa para lidiar con Big Data ... Por Eelco Plugge, David Hows, Peter Membrey, Tim Hawkins

Mi MongoDB es 3.2.

Tim
fuente

Respuestas:

119

Sintaxis incorrecta para el segundo parámetro. Consulte los documentos . Debería ser:

db.c20160712.updateOne(
    { "Attribute" : "good" }, 
    { $set: {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action" } },
    { upsert: true }
);
Alex Blex
fuente
Estoy un poco perplejo con la parte "No solo actualizo". ¿Qué más espera de la función de actualización ?
Alex Blex
3
¿Quiere decir "reemplazar" el documento? Entonces debes seguir los consejos de @ dyouberg y usar la función correcta.
Alex Blex
27

Creo que esto se cambió como un efecto secundario de la introducción del updateOne()método además update()y updateMany()como una especie de salvaguarda para evitar que el usuario anule accidentalmente un documento completo.

Puede utilizar el replaceOne()método en su lugar o update()sin especificar multi:true.

dyouberg
fuente
20

Debería usar este código porque también estaba enfrentando el mismo problema y luego usé este código:

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

y también debe definir de lo ObjectIDcontrario el problema volverá a ocurrir.

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

Cometiste el mismo error que yo. Al revisar los documentos, me di cuenta de que la sintaxis es incorrecta. Tratar:

db.c20160712.updateOne( 
   { "Attribute" : "good"}, 
   {"Type" : "DVD", "Title" : "Matrix, The", "Released" : 1999, "Genre" : "Action"}, 
   { upsert: true} 
)
Prasad Naik
fuente
6
¿Cuál es la diferencia de sintaxis?
baruchiro