Fügen Sie jedem Dokument in einer MongoDB-Sammlung ein neues Feld hinzu
-
der
$set
-Operator in MongoDB -
der
$setOnInsert
-Operator in MongoDB - Neues Feld zu Dokumenten in einer MongoDB-Sammlung hinzufügen
Dieser Artikel behandelt die Operationen $set
und $setOnInsert
. Darüber hinaus wird das Problem des Hinzufügens eines Felds in Sammlungen in MongoDB anhand dieser beiden Operatoren ebenfalls kurz erläutert.
der $set
-Operator in MongoDB
Der Operator $set
ändert den Wert eines Felds auf den angegebenen Wert. Der Operatorausdruck $set
sieht so aus: { $set: { <field1>: <value1>, ... } }
.
Verwenden Sie die Punktnotation, um ein <Feld>
in einem eingebetteten Text oder einem Array zu definieren.
Verhalten des Operators $set
Ab MongoDB 5.0 verarbeiten Aktualisierungsoperatoren Dokumentfelder mit zeichenfolgenbasierten Namen in lexikografischer Reihenfolge. Numerisch benannte Felder werden in numerischer Reihenfolge behandelt.
Wenn das Feld noch nicht existiert, erstellt $set
eines mit dem angeforderten Wert, solange das neue Feld keine Typbeschränkung verletzt. Wenn Sie einen gepunkteten Pfad für ein nicht vorhandenes Feld angeben, erstellt $set
die eingebetteten Dokumente nach Bedarf, um den gepunkteten Pfad zu vervollständigen.
$set
aktualisiert oder erstellt jedes Feld, wenn Sie mehrere Feld-Wert-Paare angeben.
Wenn Sie in MongoDB 5.0 einen Aktualisierungsoperator wie $set
mit einem leeren Operandenausdruck ({}
) verwenden, gibt mongod
keinen Fehler mehr aus. Es gibt keine Änderungen aufgrund einer leeren Aktualisierung, und es wird kein oplog
-Datensatz erstellt (was bedeutet, dass die Operation keine Operation ist).
Lassen Sie uns zum Beispiel die Kollektion Kleidung
erstellen:
db.clothes.insertOne(
{
_id: 100,
quantity: 250,
instock: true,
reorder: false,
details: { model: "14RR", make: "Clothes" },
tags: [ "apparel", "clothing" ],
ratings: [ { by: "Customer127", rating: 5 } ]
}
)
Legen Sie Felder der obersten Ebene fest
Das folgende Verfahren verwendet den Operator $set
, um den Wert der Felder Menge
, details
und tags
für das Dokument zu ändern, das das Kriterium _id
gleich 100
erfüllt.
db.clothes.updateOne(
{ _id: 100 },
{ $set:
{
quantity: 400,
details: { model: "2600", make: "Fashionables" },
tags: [ "coats", "outerwear", "clothing" ]
}
}
)
Der Vorgang aktualisiert Folgendes:
- Wert von
Menge
auf400
. - Feld
details
mit dem neuen eingebetteten Dokument. - Feld
tags
mit dem neuen Array.
Das Dokument hat jetzt die folgenden Werte:
{
_id: 100,
quantity: 400,
instock: true,
reorder: false,
details: { model: '2600', make: 'Fashionables' },
tags: [ 'coats', 'outerwear', 'clothing' ],
ratings: [ { by: 'Customer127', rating: 5 } ]
}
Felder in eingebetteten Dokumenten festlegen
Verwenden Sie die Punktnotation, um ein <Feld>
in einem eingebetteten Text oder einem Array zu bezeichnen. Die folgende Aktion ändert das Feld make
im Dokument details
für das Dokument, das das Kriterium _id
gleich 100
erfüllt:
db.clothes.updateOne(
{ _id: 100 },
{ $set: { "details.make": "Kidz" } }
)
Nach dem Update hat das Dokument nun folgende Werte:
Elemente in Arrays setzen
Verwenden Sie die Punktnotation, um ein <Feld>
in einem eingebetteten Text oder einem Array zu kennzeichnen.
Die folgende Aktion ändert den Wert des zweiten Elements im Feld tags
und das Feld ratings
im ersten Element des Arrays ratings
für das Dokument, das das Kriterium _id
gleich 100
erfüllt.
db.clothes.updateOne(
{ _id: 100 },
{ $set:
{
"tags.1": "rain wear",
"ratings.0.rating": 3
}
}
)
Nach dem Update hat das Dokument nun folgende Werte:
der $setOnInsert
-Operator in MongoDB
Wird ein Dokument aufgrund einer Update-Operation mit upsert: true
eingefügt, dann wendet $setOnInsert
die gelieferten Werte auf die Felder im Dokument an. $setOnInsert
tut nichts, wenn die Aktualisierungsaktion nicht zu einer Einfügung führt.
Die Option upsert
kann angegeben werden.
Verhalten des Operators $setOnInsert
Ab MongoDB 5.0 verarbeiten Aktualisierungsoperatoren Dokumentfelder mit zeichenfolgenbasierten Namen in lexikografischer Reihenfolge. Numerisch benannte Felder werden in numerischer Reihenfolge behandelt.
Wenn Sie in MongoDB 5.0 einen Aktualisierungsoperator wie $setOnInsert
mit einem leeren Operandenausdruck ({}
) verwenden, gibt mongod
keinen Fehler mehr aus. Es gibt keine Änderungen aufgrund einer leeren Aktualisierung, und es wird kein oplog
-Datensatz erstellt (was bedeutet, dass die Operation keine Operation ist).
Beispielsweise enthält die Sammlung Kleider
keine Dokumente. Wir fügen ein neues Dokument mit db.collection.updateOne()
mit dem Parameter upsert: true
ein.
db.clothes.updateOne(
{ _id: 1 },
{
$set: { item: "banana" },
$setOnInsert: { defaultQty: 100 }
},
{ upsert: true }
)
<query>
wird von MongoDB verwendet, um ein neues Dokument mit der Kennung _id: 1
zu erstellen. $setOnInsert
nimmt die angeforderten Änderungen am Dokument vor.
Das neu eingefügte Dokument befindet sich in der Sammlung Kleidung
:
{ "_id" : 1, "item" : "banana", "defaultQty" : 100 }
Wenn der upsert
-Parameter true
ist, wird die db.collection.updateOne()
-Methode:
- Erstellt ein neues Dokument,
- Wendet die Operation
$set
an, - Wendet die Operation
$setOnInsert
an.
Wenn db.collection.updateOne()
mit einem bestehenden Dokument übereinstimmt, wendet MongoDB nur die Operation $set
an.
Neues Feld zu Dokumenten in einer MongoDB-Sammlung hinzufügen
Sie können die folgenden Methoden verwenden, um jedem Dokument in einer Sammlung in MongoDB ein neues Feld hinzuzufügen.
Es werden auch Beispiele gezeigt, um jede Methode mit einem Sammlungsteam mit den folgenden Dokumenten zu verwenden:
db.teams.insertOne({team: "United", position: "Defence", points: 31})
db.teams.insertOne({team: "Spurs", position: "Defence", points: 22})
db.teams.insertOne({team: "Palace", position: "Center", points: 19})
db.teams.insertOne({team: "Eagles", position: "Forward", points: 26})
db.teams.insertOne({team: "Lions", position: "Defence", points: 33})
Neues Feld ohne Werte hinzufügen
Syntax:
db.collection.updateMany({}, {$set:{"new_field": null}})
Sie können den folgenden Code verwenden, um jedem vorhandenen Dokument in der Sammlung ein neues Feld namens rebounds
mit einem null
-Wert hinzuzufügen:
db.teams.updateMany({}, {$set:{"rebounds": null}})
Sie können die folgende Abfrage schreiben, um die ersten paar aktualisierten Dokumente anzuzeigen:
db.teams.find().limit(3)
Diese Abfrage gibt die folgenden Dokumente zurück:
Neues Feld mit spezifischem Wert hinzufügen
Syntax:
db.collection.updateMany({}, {$set:{"new_field": 10}})
Sie können den folgenden Code verwenden, um jedem vorhandenen Dokument in der Sammlung ein neues Feld namens rebounds
mit dem Wert 10
hinzuzufügen:
db.teams.updateMany({}, {$set:{"rebounds": 10}})
Sie können die folgende Abfrage schreiben, um die ersten paar aktualisierten Dokumente anzuzeigen:
db.teams.find().limit(3)
Diese Abfrage gibt die folgenden Dokumente zurück:
Neues Feld mit Werten aus vorhandenen Feldern hinzufügen
Syntax:
db.collection.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$field1", " ", "$field2"]}}}
]
)
Sie können den folgenden Code verwenden, um ein Feld namens name
hinzuzufügen, dessen Wert eine Verkettung der vorhandenen Felder team
und position
ist.
db.teams.updateMany(
{},
[
{"$set": {"name": { "$concat": ["$team", " ", "$position"]}}}
]
)
Sie können die folgende Abfrage schreiben, um die ersten paar aktualisierten Dokumente anzuzeigen:
db.teams.find().limit(3)
Diese Abfrage gibt die folgenden Dokumente zurück: