Fügen Sie jedem Dokument in einer MongoDB-Sammlung ein neues Feld hinzu

334

Wie kann ich jedem Dokument in einer vorhandenen Sammlung ein neues Feld hinzufügen?

Ich weiß, wie man das Feld eines vorhandenen Dokuments aktualisiert, aber nicht, wie man jedem Dokument in einer Sammlung ein neues Feld hinzufügt. Wie kann ich das in der mongoShell machen?

da ich bin
quelle

Antworten:

598

Wie beim Aktualisieren des vorhandenen Sammlungsfelds $setwerden neue Felder hinzugefügt, wenn das angegebene Feld nicht vorhanden ist.

Schauen Sie sich dieses Beispiel an:

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

BEARBEITEN:

Wenn Sie Ihrer gesamten Sammlung ein neues_Feld hinzufügen möchten, müssen Sie den leeren Selektor verwenden und das Multi-Flag auf true (letzter Parameter) setzen, um alle Dokumente zu aktualisieren

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

BEARBEITEN:

Im obigen Beispiel geben die letzten beiden Felder false, truedie Flags upsertund an multi.

Upsert: Wenn auf true gesetzt, wird ein neues Dokument erstellt, wenn kein Dokument den Abfragekriterien entspricht.

Multi: Wenn auf true gesetzt, werden mehrere Dokumente aktualisiert, die die Abfragekriterien erfüllen. Wenn false festgelegt ist, wird ein Dokument aktualisiert.

Dies ist für Mongo versionsvor 2.2. Bei den neuesten Versionen wurde die Abfrage etwas geändert

db.your_collection.update({},
                          {$set : {"new_field":1}},
                          {upsert:false,
                          multi:true}) 
RameshVel
quelle
7
Ist es möglich, ohne Wert zu schaffen
Yasar Arafath
7
db.your_collection.update ({}, {$ set: {"new_field": null}}, {upsert: false, multi: true})
Nilesh
1
Was ist, wenn ich ein leeres Array erstellen möchte?
Prashant Pokhriyal
3
@PrashantPokhriyal db.your_collection.update ({}, {$ set: {"new_field": []}}, {upsert: false, multi: true})
Máxima Alekz
3
Was ist, wenn Sie das neue Feld mit dem dynamisch zugewiesenen Wert erstellen möchten? Zum Beispiel möchte ich new_fieldein int sein, das der Länge des Strings im testFeld entspricht.
Qed
2

Zur Verdeutlichung lautet die Syntax für MongoDB Version 4.0.x wie folgt:

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

Hier ist ein Arbeitsbeispiel zum Hinzufügen eines veröffentlichten Felds zur Artikelsammlung und zum Setzen des Feldwerts auf true :

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

Pymongo 3.9+

update()jetzt ist veraltet und Sie sollten verwendet werden replace_one(), update_one()oder update_many()stattdessen.

In meinem Fall habe ich verwendet update_many()und es hat mein Problem gelöst:

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

Aus Dokumenten

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
quelle