1. Panoramica
In questo tutorial, introdurremo come inserire documenti in un array in MongoDB. Inoltre, vedremo varie applicazioni di $push e $addToset operatori per aggiungere valori in una matrice.
In primo luogo, creeremo un database di esempio, una raccolta e vi inseriremo dati fittizi. Inoltre, esamineremo alcuni esempi di base per aggiornare un documento utilizzando $push operatore. Successivamente, discuteremo anche i vari casi d'uso di $push e $addtoSet operatori.
Analizziamo i vari metodi per inserire documenti in un array in MongoDB.
2. Inizializzazione database
Prima di tutto, impostiamo un nuovo database baeldung e un campionario, ordini :
use baeldung;
db.createCollection(orders);
Aggiungiamo ora alcuni documenti alla raccolta utilizzando insertMany metodo:
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
}
]
}
]);
In caso di inserimento riuscito, il comando precedente stamperà un JSON simile a quello mostrato di seguito:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Fino ad ora, abbiamo impostato con successo il database e la raccolta. Useremo questo database e questa raccolta per tutti gli esempi.
3. Operazione push utilizzando Mongo Query
MongoDB fornisce vari tipi di operatori di array per aggiornare gli array nei documenti MongoDB. La $push l'operatore in MongoDB aggiunge il valore alla fine dell'array. A seconda del tipo di query, possiamo utilizzare $push operatore con metodi come updateOne , aggiorna molti , trova e modifica , ecc.
Esaminiamo ora la query della shell usando $push operatore:
db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});
La query precedente restituirà il seguente documento:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Ora controlliamo il documento con customerId 1023. Qui possiamo vedere che la nuova voce è inserita alla fine della lista “articoli “:
{
"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. Operazione push tramite codice driver Java
Fino ad ora, abbiamo discusso della query della shell MongoDB per inserire il documento in un array. Ora implementiamo la query di aggiornamento push utilizzando il codice Java.
Prima di eseguire l'operazione di aggiornamento, connettiamoci agli ordini raccolta nel baeldung banca dati:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");
Qui, in questo caso, ci stiamo connettendo a MongoDB che è in esecuzione sulla porta predefinita 27017 su localhost.
4.1. Utilizzando il DBObject
Il driver MongoDB Java fornisce il supporto di entrambi DBObject e BSON documento. Qui, il DBObject fa parte del driver legacy di MongoDB, ma è deprecato nella versione più recente di MongoDB.
Esaminiamo ora il codice del driver Java per inserire nuovi valori nell'array:
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);
Nella query precedente, abbiamo prima creato il documento dell'elemento utilizzando BasicDBObject . Sulla base di searchQuery i documenti della raccolta verranno filtrati e i valori verranno inseriti nell'array.
4.2. Utilizzando il BSON Documento
Il BSON Document è il nuovo modo per accedere al documento MongoDB in Java creato con lo stack client più recente. Il org.bson.Document la classe è meno complicata e più facile da usare.
Usiamo il org.bson.Document classe per inserire i valori nell'array "items" :
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 questo caso, l'implementazione del BSON è simile al codice eseguito utilizzando DBObject, e anche l'aggiornamento sarà lo stesso. Qui abbiamo usato updateOne metodo per aggiornare un solo documento.
5. Utilizzando addToSet Operatore
Il $addToSet operatore può anche essere utilizzato per inviare un valore nell'array. Questo operatore aggiunge valori solo se quel valore non esiste nell'array. Altrimenti, lo ignorerà. Considerando che l'operatore push spingerà il valore come condizione per filtrare la corrispondenza.
Un punto chiave da notare è il $addToSet l'operatore non esegue il push del valore di lavoro nel caso di un elemento duplicato. D'altra parte, l'operatore $push inserisce semplicemente il valore nell'array indipendentemente da qualsiasi altra condizione.
5.1. Query della shell utilizzando addToSet Operatore
La query mongo shell di $addToSet è simile a $push operatore, ma il $addToSet non inserisce il valore duplicato nell'array.
Esaminiamo ora la query MongoDB per inserire i valori in un array usando $addToset :
db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});
In questo caso, l'output sarà il seguente:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
In questo caso, abbiamo utilizzato $addToSet operatore e il documento verrà inviato agli "elementi" dell'array solo se è univoco.
5.2. Driver Java che utilizza addToSet Operatore
Il $addToSet operatore fornisce un tipo diverso di operazione di aggiornamento dell'array rispetto all'operatore push:
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);
Nel codice sopra, per prima cosa, abbiamo creato il documento "item “, e sulla base del customerId filtro, updateOne cercherà di inviare il documento "item ” nell'array “elementi “.