1. Översikt
I den här handledningen kommer vi att introducera hur man infogar dokument i en array i MongoDB. Dessutom kommer vi att se olika tillämpningar av $push och $addToset operatorer för att lägga till värden i en array.
Först skapar vi en exempeldatabas, en samling och infogar dummydata i den. Vidare ska vi titta på några grundläggande exempel för att uppdatera ett dokument med $push operatör. Senare kommer vi också att diskutera de olika användningsfallen för $push och $addtoSet operatörer.
Låt oss djupdyka i de olika metoderna för att infoga dokument i en array i MongoDB.
2. Databasinitiering
Först av allt, låt oss skapa en ny databas baeldung och en provsamling, beställningar :
use baeldung;
db.createCollection(orders);
Låt oss nu lägga till några dokument i samlingen genom att använda insertMany metod:
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
}
]
}
]);
I händelse av lyckad infogning kommer kommandot ovan att skriva ut en JSON liknande den som visas nedan:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Tills nu har vi framgångsrikt konfigurerat databasen och samlingen. Vi kommer att använda denna databas och samling för alla exempel.
3. Push-operation med Mongo Query
MongoDB tillhandahåller olika typer av arrayoperatorer för att uppdatera arrayerna i MongoDB-dokument. $push operatorn i MongoDB lägger till värdet i slutet av arrayen. Beroende på typen av fråga kan vi använda $push operator med metoder som updateOne , uppdatera många , findAndModify , etc.
Låt oss nu titta på skalfrågan med $push operatör:
db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});
Ovanstående fråga returnerar följande dokument:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Låt oss nu kontrollera dokumentet med customerId 1023. Här kan vi se att det nya objektet är infogat i slutet av listan "objekt ":
{
"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 med Java-drivrutinskod
Tills nu har vi diskuterat MongoDB-skalfrågan för att skjuta dokumentet till en array. Låt oss nu implementera push-uppdateringsfrågan med hjälp av Java-koden.
Innan vi utför uppdateringen, låt oss först ansluta till beställningarna samling i baeldung databas:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");
Här, i det här fallet, ansluter vi till MongoDB som körs på standardport 27017 på localhost.
4.1. Använda DBObject
MongoDB Java-drivrutinen ger stöd för både DBObject och BSON dokumentera. Här, DBObject är en del av MongoDB äldre drivrutin, men den är utfasad i den nyare versionen av MongoDB.
Låt oss nu titta på Java-drivrutinskoden för att infoga nya värden i arrayen:
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);
I ovanstående fråga skapade vi först objektdokumentet med BasicDBObject . På grundval av searchQuery, dokumenten i samlingen kommer att filtreras, och värdena kommer att skjutas in i arrayen.
4.2. Använda BSON Dokument
BSON Document är det nya sättet att komma åt MongoDB-dokumentet i Java som är byggt med den nyare klientstacken. org.bson.Document klass är mindre komplicerat och lättare att använda.
Låt oss använda org.bson.Document klass för att trycka in värden i arrayen "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));
I det här fallet, implementeringen av BSON liknar koden som körs med DBObject, och uppdateringen kommer också att vara densamma. Här använde vi updateOne metod för att uppdatera endast ett enda dokument.
5. Använda addToSet Operatör
$addToSet operatorn kan också användas för att pusha ett värde i arrayen. Den här operatorn lägger bara till värden om det värdet inte finns i arrayen. Annars kommer den bara att ignorera det. Medan push-operatorn trycker på värdet som villkor för att filtrera för att få matchningen.
En viktig punkt att notera är $addToSet operatören trycker inte på värdearbetet i fallet med en dubblettartikel. Å andra sidan, $push-operatorn skjuter bara in värdet i arrayen oavsett andra villkor.
5.1. Skalfråga med hjälp av addToSet Operatör
Mongo-skalfrågan för $addToSet operatorn liknar $push operatorn, men $addToSet infogar inte dubblettvärdet i arrayen.
Låt oss nu kolla in MongoDB-frågan för att skjuta in värdena i en array med $addToset :
db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});
I det här fallet blir utgången enligt följande:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
I det här fallet använde vi $addToSet operatör, och dokumentet kommer att skickas till array "objekt" endast om det är unikt.
5.2. Java-drivrutin med addToSet Operatör
$addToSet operatorn tillhandahåller en annan typ av arrayuppdateringsoperation jämfört med push-operatorn:
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);
I koden ovan skapade vi först dokumentet "item ", och på basis av customerId filter, updateOne metod kommer att försöka skicka dokumentet "item " i arrayen "objekt ".