Agregue un nuevo campo a cada documento en una colección MongoDB

335

¿Cómo puedo agregar un nuevo campo a cada documento en una colección existente?

Sé cómo actualizar el campo de un documento existente, pero no cómo agregar un nuevo campo a cada documento de una colección. ¿Cómo puedo hacer esto en el mongoshell?

soy yo
fuente

Respuestas:

600

Igual que la actualización del campo de recopilación existente, $setagregará nuevos campos si el campo especificado no existe.

Mira este ejemplo:

> db.foo.find()
> db.foo.insert({"test":"a"})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> item = db.foo.findOne()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> db.foo.update({"_id" :ObjectId("4e93037bbf6f1dd3a0a9541a") },{$set : {"new_field":1}})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "new_field" : 1, "test" : "a" }

EDITAR:

En caso de que desee agregar un nuevo campo a toda su colección, debe usar un selector vacío y establecer el indicador múltiple en verdadero (último parámetro) para actualizar todos los documentos

db.your_collection.update(
  {},
  { $set: {"new_field": 1} },
  false,
  true
)

EDITAR:

En el ejemplo anterior, los últimos 2 campos false, trueespecifican las banderas upserty multi.

Upsert: si se establece en true, crea un nuevo documento cuando ningún documento coincide con los criterios de consulta.

Multi: si se establece en verdadero, actualiza varios documentos que cumplen con los criterios de consulta. Si se establece en falso, actualiza un documento.

Esto es para Mongo versionsantes de 2.2. Para las últimas versiones, la consulta cambia un poco

db.your_collection.update({},
                          {$set : {"new_field":1}},
                          {upsert:false,
                          multi:true}) 
RameshVel
fuente
77
¿Es posible crear sin valor
Yasar Arafath
77
db.your_collection.update ({}, {$ set: {"new_field": null}}, {upsert: false, multi: true})
Nilesh
1
¿Qué pasa si quiero crear una matriz vacía?
Prashant Pokhriyal
3
@PrashantPokhriyal db.your_collection.update ({}, {$ set: {"new_field": []}}, {upsert: false, multi: true})
Máxima Alekz
3
¿Qué sucede si desea crear el nuevo campo con el valor asignado dinámicamente? Por ejemplo, me gustaría tener new_fieldque ser un int igual a la longitud de la cadena en el testcampo.
qed
3

Para aclarar, la sintaxis es la siguiente para MongoDB versión 4.0.x:

db.collection.update({},{$set: {"new_field*":1}},false,true)

Aquí hay un ejemplo de trabajo que agrega un campo publicado a la colección de artículos y establece el valor del campo en verdadero :

db.articles.update({},{$set: {"published":true}},false,true)
LineDrop
fuente
0

Pymongo 3.9+

update()ya no se utiliza y se debe utilizar replace_one(), update_one()o update_many()en su lugar.

En mi caso, usé update_many()y resolvió mi problema:

db.your_collection.update_many({}, {"$set": {"new_field": "value"}}, upsert=False, array_filters=None)

De documentos

update_many(filter, update, upsert=False, array_filters=None, bypass_document_validation=False, collation=None, session=None)


filter: A query that matches the documents to update.

update: The modifications to apply.

upsert (optional): If True, perform an insert if no documents match the filter.

bypass_document_validation (optional): If True, allows the write to opt-out of document level validation. Default is False.

collation (optional): An instance of Collation. This option is only supported on MongoDB 3.4 and above.

array_filters (optional): A list of filters specifying which array elements an update should apply. Requires MongoDB 3.6+.

session (optional): a ClientSession.
Alex Jolig
fuente