MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Push-Operationen in MongoDB

1. Übersicht

In diesem Tutorial stellen wir vor, wie Sie Dokumente in ein Array in MongoDB einfügen. Außerdem sehen wir verschiedene Anwendungen von $push and $addToset Operatoren zum Hinzufügen von Werten zu einem Array.

Zuerst erstellen wir eine Beispieldatenbank, eine Sammlung, und fügen Dummy-Daten darin ein. Außerdem sehen wir uns ein paar grundlegende Beispiele an, um ein Dokument mit $push zu aktualisieren Operator. Später werden wir auch die verschiedenen Anwendungsfälle von $push besprechen und $addtoSet Betreiber.

Tauchen wir ein in die verschiedenen Methoden zum Einfügen von Dokumenten in ein Array in MongoDB.

2. Datenbankinitialisierung

Als erstes richten wir eine neue Datenbank baeldung ein und eine Musterkollektion, Bestellungen :

use baeldung;
db.createCollection(orders);

Lassen Sie uns nun ein paar Dokumente zur Sammlung hinzufügen, indem wir insertMany verwenden Methode:

db.orders.insertMany([
    {
        "customerId": 1023,
        "orderTimestamp": NumberLong("1646460073000"),
        "shippingDestination": "336, Street No.1 Pawai Mumbai",
        "purchaseOrder": 1000,
        "contactNumber":"9898987676",
        "items": [ 
            {
                "itemName": "BERGER",
                "quantity": 1,
                "price": 500
            },
            {
                "itemName": "VEG PIZZA",
                "quantity": 1,
                "price": 800
            } 
          ]
    },
    {
        "customerId": 1027,
        "orderTimestamp": NumberLong("1646460087000"),
        "shippingDestination": "445, Street No.2 Pawai Mumbai",
        "purchaseOrder": 2000,
        "contactNumber":"9898987676",
        "items": [ 
            {
               "itemName": "BERGER",
               "quantity": 1,
               "price": 500
            },
            {
               "itemName": "NON-VEG PIZZA",
               "quantity": 1,
               "price": 1200
            } 
          ]
    }
]);

Bei erfolgreicher Einfügung druckt der obige Befehl ein JSON ähnlich dem unten gezeigten:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
	ObjectId("622300cc85e943405d04b568")
    ]
}

Bis jetzt haben wir die Datenbank und Sammlung erfolgreich eingerichtet. Wir werden diese Datenbank und Sammlung für alle Beispiele verwenden.

3. Push-Vorgang mit Mongo-Abfrage

MongoDB stellt verschiedene Arten von Array-Operatoren bereit, um die Arrays in MongoDB-Dokumenten zu aktualisieren. Der $push Operator in MongoDB hängt den Wert am Ende des Arrays an. Je nach Art der Abfrage können wir den $push verwenden Operator mit Methoden wie updateOne , updateMany , findAndModify usw.

Sehen wir uns nun die Shell-Abfrage mit $push an Betreiber:

db.orders.updateOne(
    {
        "customerId": 1023
    },
    {
        $push: {
            "items":{
                "itemName": "PIZZA MANIA",
                "quantity": 1,
                "price": 800
            }
        }
    });

Die obige Abfrage gibt das folgende Dokument zurück:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Prüfen wir nun das Dokument mit customerId  1023. Hier können wir sehen, dass das neue Element am Ende der Liste „Elemente eingefügt wird “:

{
    "customerId" : 1023,
    "orderTimestamp" : NumberLong("1646460073000"),
    "shippingDestination" : "336, Street No.1 Pawai Mumbai",
    "purchaseOrder" : 1000,
    "contactNumber" : "9898987676",
    "items" : [
        {
            "itemName" : "BERGER",
            "quantity" : 1,
	    "price" : 500
        },
	{
            "itemName" : "VEG PIZZA",
	    "quantity" : 1,
	    "price" : 800
	},
	{
	    "itemName" : "PIZZA MANIA",
	    "quantity" : 1,
	    "price" : 800
        }
    ]
}

4. Push-Vorgang mit Java-Treibercode

Bis jetzt haben wir die MongoDB-Shell-Abfrage besprochen, um das Dokument in ein Array zu verschieben. Lassen Sie uns nun die Push-Update-Abfrage mit dem Java-Code implementieren.

Bevor Sie den Aktualisierungsvorgang durchführen, stellen wir zunächst eine Verbindung zu den Bestellungen her Sammlung in der baeldung Datenbank:

mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");

In diesem Fall stellen wir hier eine Verbindung zu MongoDB her, die auf dem Standardport 27017 auf localhost ausgeführt wird.

4.1. Verwenden des DBObject

Der MongoDB-Java-Treiber unterstützt sowohl das DBObject und BSON dokumentieren. Hier das DBObject ist Teil des alten MongoDB-Treibers, aber ist in der neueren Version von MongoDB veraltet.

Sehen wir uns nun den Java-Treibercode an, um neue Werte in das Array einzufügen:

DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
  .append("quantity", 1)
  .append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);

In der obigen Abfrage haben wir zuerst das Artikeldokument mit dem BasicDBObject erstellt . Auf der Grundlage von searchQuery Die Dokumente der Sammlung werden gefiltert und die Werte in das Array geschoben.

4.2. Mit dem BSON Dokument

Der BSON Dokument ist die neue Möglichkeit, auf das MongoDB-Dokument in Java zuzugreifen, das mit dem neueren Client-Stack erstellt wurde. Das org.bson.Document Klasse ist weniger kompliziert und einfacher zu verwenden.

Verwenden wir das org.bson.Document  Klasse, um Werte in das Array „items“ zu übertragen :

Document item = new Document()
  .append("itemName1", "PIZZA MANIA")
  .append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));

In diesem Fall die Implementierung des BSON ähnelt dem Code, der mit dem DBObject, ausgeführt wird und die Aktualisierung wird auch die gleiche sein. Hier haben wir das updateOne verwendet Methode, um nur ein einzelnes Dokument zu aktualisieren.

5. Verwenden von addToSet Betreiber

Das $addToSet Der Operator kann auch verwendet werden, um einen Wert in das Array zu verschieben. Dieser Operator fügt nur dann Werte hinzu, wenn dieser Wert nicht im Array vorhanden ist. Andernfalls wird es einfach ignoriert. Während der Push-Operator den Wert als Bedingung zum Filtern der Übereinstimmung pusht.

Ein wichtiger zu beachtender Punkt ist $addToSet Der Operator pusht den Wert work im Fall eines doppelten Elements nicht. Andererseits der $push-Operator schiebt den Wert einfach in das Array, unabhängig von anderen Bedingungen.

5.1. Shell-Abfrage mit addToSet Betreiber

Die Mongo-Shell-Abfrage von $addToSet Der Operator ähnelt dem $push -Operator, aber der $addToSet fügt den doppelten Wert nicht in das Array ein.

Sehen wir uns nun die MongoDB-Abfrage an, um die Werte mithilfe von $addToset in ein Array zu verschieben :

db.orders.updateOne(
    {
        "customerId": 1023
    },
    {
        $addToSet: {
            "items":{
                "itemName": "PASTA",
                "quantity": 1,
                "price": 1000
            }
        }
    });

In diesem Fall sieht die Ausgabe wie folgt aus:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

In diesem Fall haben wir das $addToSet verwendet -Operator, und das Dokument wird nur dann in das Array „items“ verschoben, wenn es eindeutig ist.

5.2. Java-Treiber mit addToSet Betreiber

Das $addToSet Der Operator bietet im Vergleich zum Push-Operator eine andere Art von Array-Aktualisierungsoperation:

Document item = new Document()
  .append("itemName1", "PIZZA MANIA")
  .append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
  .updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);

Im obigen Code haben wir zuerst das Dokument „item “, und auf Basis der customerId Filter, das updateOne -Methode versucht, das Dokument „item “ in das Array „items “.