Aggiungi un nuovo campo a ogni documento in una raccolta MongoDB


335

Come posso aggiungere un nuovo campo a ogni documento in una raccolta esistente?

So come aggiornare il campo di un documento esistente ma non come aggiungere un nuovo campo a ogni documento di una raccolta. Come posso farlo nella mongoshell?

Risposte:


600

Come per l'aggiornamento del campo di raccolta esistente, $setverranno aggiunti nuovi campi se il campo specificato non esiste.

Dai un'occhiata a questo esempio:

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

MODIFICARE:

Nel caso in cui desideri aggiungere un new_field a tutta la tua raccolta, devi utilizzare un selettore vuoto e impostare il multi flag su true (ultimo parametro) per aggiornare tutti i documenti

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

MODIFICARE:

Nell'esempio sopra gli ultimi 2 campi false, truespecifica i flag upserte multi.

Upsert: se impostato su true, crea un nuovo documento quando nessun documento corrisponde ai criteri di query.

Multi: se impostato su true, aggiorna più documenti che soddisfano i criteri di query. Se impostato su false, aggiorna un documento.

Questo è per Mongo versionsprima di 2.2. Per le ultime versioni la query viene leggermente modificata

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

7
È possibile creare senza valore
Yasar Arafath il

7
db.your_collection.update ({}, {$ set: {"new_field": null}}, {upsert: false, multi: true})
Nilesh,

1
e se volessi creare un array vuoto?
Prashant Pokhriyal,

3
@PrashantPokhriyal db.your_collection.update ({}, {$ set: {"new_field": []}}, {upsert: false, multi: true})
Máxima Alekz,

3
Cosa succede se si desidera creare il nuovo campo con il valore assegnato in modo dinamico? Ad esempio, vorrei new_fieldessere un int uguale alla lunghezza della stringa nel testcampo.
Qed

3

Per chiarire, la sintassi è la seguente per MongoDB versione 4.0.x:

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

Ecco un esempio funzionante che aggiunge un campo pubblicato alla raccolta di articoli e imposta il valore del campo su true :

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

0

Pymongo 3.9+

update()è ora sconsigliato e si dovrebbe usare replace_one(), update_one()o update_many()invece.

Nel mio caso ho usato update_many()e risolto il mio problema:

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

Dai documenti

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.