Respuestas:
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})
new_fieldque ser un int igual a la longitud de la cadena en el testcampo.
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)
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.