1. Přehled
V tomto tutoriálu si představíme, jak vložit dokumenty do pole v MongoDB. Kromě toho uvidíme různé aplikace $push a $addToset operátory pro přidání hodnot do pole.
Nejprve vytvoříme ukázkovou databázi, kolekci a vložíme do ní fiktivní data. Dále se podíváme na několik základních příkladů aktualizace dokumentu pomocí $push operátor. Později také probereme různé případy použití $push a $addtoSet operátory.
Pojďme se hlouběji ponořit do různých metod vkládání dokumentů do pole v MongoDB.
2. Inicializace databáze
Nejprve si nastavíme novou databázi baeldung a ukázková kolekce, objednávky :
use baeldung;
db.createCollection(orders);
Pojďme nyní přidat několik dokumentů do sbírky pomocí insertMany metoda:
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
}
]
}
]);
V případě úspěšného vložení vypíše výše uvedený příkaz JSON podobný tomu, který je zobrazen níže:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Doposud jsme úspěšně založili databázi a kolekci. Tuto databázi a kolekci použijeme pro všechny příklady.
3. Push Operation pomocí Mongo Query
MongoDB poskytuje různé typy operátorů polí pro aktualizaci polí v dokumentech MongoDB. $push operátor v MongoDB připojí hodnotu na konec pole. V závislosti na typu dotazu můžeme použít $push operátor s metodami jako updateOne , updateMany , findAndModify , atd.
Podívejme se nyní na dotaz shellu pomocí $push operátor:
db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});
Výše uvedený dotaz vrátí následující dokument:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Pojďme nyní zkontrolovat dokument pomocí customerId 1023. Zde vidíme, že nová položka je vložena na konec seznamu „položky “:
{
"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 Operation pomocí Java Driver Code
Doposud jsme diskutovali o dotazu shellu MongoDB pro vložení dokumentu do pole. Pojďme nyní implementovat dotaz push aktualizace pomocí kódu Java.
Před provedením operace aktualizace se nejprve připojte k objednávkám sbírka v baeldung databáze:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");
Zde se v tomto případě připojujeme k MongoDB, která běží na výchozím portu 27017 na localhost.
4.1. Pomocí DBOobject
Ovladač MongoDB Java poskytuje podporu pro DBObject a BSON dokument. Zde DBOobject je součástí staršího ovladače MongoDB, ale je v novější verzi MongoDB zastaralý.
Podívejme se nyní na kód ovladače Java pro vložení nových hodnot do pole:
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);
Ve výše uvedeném dotazu jsme nejprve vytvořili dokument položky pomocí BasicDBObject . Na základě searchQuery dokumenty kolekce budou filtrovány a hodnoty budou vloženy do pole.
4.2. Pomocí BSON Dokument
BSON Document je nový způsob přístupu k dokumentu MongoDB v Javě, který je vytvořen s novějším klientským stackem. org.bson.Document třída je méně komplikovaná a snáze se používá.
Použijme org.bson.Document třídy pro vložení hodnot do pole „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));
V tomto případě implementace BSON je podobný kódu spouštěnému pomocí DBObject, a aktualizace bude také stejná. Zde jsme použili updateOne způsob aktualizace pouze jednoho dokumentu.
5. Pomocí addToSet Operátor
$addToSet operátor lze také použít k vložení hodnoty do pole. Tento operátor přidává hodnoty pouze v případě, že tato hodnota v poli neexistuje. Jinak to prostě bude ignorovat. Zatímco operátor push vloží hodnotu jako podmínku pro získání shody.
Jedním z klíčových bodů, které je třeba poznamenat, je $addToSet operátor neposílá hodnotu práce v případě duplicitní položky. Na druhé straně operátor $push pouze vloží hodnotu do pole bez ohledu na jakékoli další podmínky.
5.1. Shell Query pomocí addToSet Operátor
Dotaz mongo shellu $addToSet operátor je podobný $push operátor, ale $addToSet nevloží duplicitní hodnotu do pole.
Pojďme se nyní podívat na dotaz MongoDB, který vloží hodnoty do pole pomocí $addToset :
db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});
V tomto případě bude výstup následující:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
V tomto případě jsme použili $addToSet operátor a dokument se přesune do pole „items“ pouze v případě, že je jedinečný.
5.2. Ovladač Java pomocí addToSet Operátor
$addToSet operátor poskytuje jiný typ operace aktualizace pole ve srovnání s operátorem 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);
Ve výše uvedeném kódu jsme nejprve vytvořili dokument „item “ a na základě customerId filtr, updateOne metoda se pokusí vložit dokument „položka ” do pole „položky “.