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

Tahseen Tauseef 15 Februar 2024
  1. der $set-Operator in MongoDB
  2. der $setOnInsert-Operator in MongoDB
  3. Neues Feld zu Dokumenten in einer MongoDB-Sammlung hinzufügen
Fügen Sie jedem Dokument in einer MongoDB-Sammlung ein neues Feld hinzu

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:

  1. Wert von Menge auf 400.
  2. Feld details mit dem neuen eingebetteten Dokument.
  3. 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:

Festlegen von Feldern in eingebetteten Dokumenten – Ausgabe

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:

Elemente in Arrays setzen - Ausgabe

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:

  1. Erstellt ein neues Dokument,
  2. Wendet die Operation $set an,
  3. 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 ohne Werte hinzufügen - Ausgabe

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 spezifischem Wert hinzufügen - Ausgabe

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:

Neues Feld mit Werten aus vorhandenen Feldern hinzufügen - Ausgabe

Verwandter Artikel - MongoDB Collection