1. Przegląd
$wypychanie to operator aktualizacji w MongoDB, który dodaje wartość do tablicy. Natomiast zestaw $ operator służy do aktualizowania wartości istniejącego pola w dokumencie.
W tym krótkim samouczku przedstawimy, jak wykonać $push i zestaw $ operacje razem w jednym zapytaniu aktualizacyjnym.
2. Inicjalizacja bazy danych
Zanim przejdziemy dalej, aby wykonać wiele operacji aktualizacji, najpierw musimy skonfigurować bazę danych baeldung i próbki kolekcji znaki :
use baeldung;
db.createCollection(marks);
Wstawmy kilka dokumentów do kolekcji marks za pomocą insertMany metoda MongoDB:
db.marks.insertMany([
{
"studentId": 1023,
"studentName":"James Broad",
"joiningYear":"2018",
"totalMarks":100,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":40
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
},
{
"studentId": 1024,
"studentName":"Chris Overton",
"joiningYear":"2018",
"totalMarks":110,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":50
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
}
]);
Po pomyślnym wstawieniu powyższe zapytanie zwróci następującą odpowiedź:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Jak dotąd z powodzeniem wstawiliśmy kilka przykładowych dokumentów do kolekcji marks .
3. Zrozumienie problemu
Aby zrozumieć problem, najpierw zrozummy dokument, który właśnie wstawiliśmy. Zawiera szczegóły ucznia i uzyskane przez niego oceny z różnych przedmiotów. totalMarks to suma ocen uzyskanych z różnych przedmiotów.
Rozważmy sytuację, w której chcemy dodać nowy temat w subjectDetails szyk. Aby dane były również spójne, musimy zaktualizować totalMarks również w polu.
W MongoDB najpierw dodamy nowy temat do tablicy za pomocą przycisku $push operator. Następnie ustawimy totalMarks pole do określonej wartości za pomocą $set operatora.
Obie te operacje można wykonać indywidualnie za pomocą przycisku $push i zestaw $ operatora, odpowiednio. Ale możemy napisać zapytanie MongoDB, aby wykonać obie operacje razem.
4. Korzystanie z zapytania powłoki MongoDB
W MongoDB możemy aktualizować wiele pól dokumentu przy użyciu różnych operatorów aktualizacji. Tutaj użyjemy obu opcji $push i zestaw $ operatorów razem w updateOne zapytanie.
Przyjrzyjmy się przykładowi zawierającemu zarówno $push i zestaw $ operatorzy razem:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
Tutaj, w powyższym zapytaniu, dodaliśmy zapytanie filtrujące na podstawie studentId. Po otrzymaniu przefiltrowanego dokumentu aktualizujemy totalMarks za pomocą operatora $set. Oprócz tego wstawiamy nowe dane podmiotu w subjectDetails tablicę za pomocą $push operatora.
W rezultacie powyższe zapytanie zwróci następujący wynik:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Tutaj matchedCount zawiera liczbę dokumentów pasującą do filtra, podczas gdy modifiedCount zawiera liczbę zmodyfikowanych dokumentów.
5. Kod sterownika Java
Do tej pory omówiliśmy zapytanie powłoki mongo, aby użyć $push i zestaw $ operator razem. Tutaj nauczymy się zaimplementować to samo za pomocą kodu sterownika Java.
Zanim przejdziemy dalej, najpierw połączmy się z bazą danych i wymaganą kolekcją:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
Tutaj łączymy się z MongoDB, które działa na domyślnym porcie portu 27017 na hoście lokalnym.
Przyjrzyjmy się teraz kodowi sterownika Java:
Document subjectData = new Document()
.append("subjectId", 126)
.append("subjectName", "Java Programming")
.append("marks", 70);
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023),
Updates.combine(Updates.set("totalMarks", 170),
Updates.push("subjectDetails", subjectData)));
W tym fragmencie kodu użyliśmy updateOne metoda, która aktualizuje tylko jeden dokument na podstawie zastosowanego filtru studentId 1023. Następnie użyliśmy Updates.combine do wykonywania wielu operacji w jednym wywołaniu. Pole totalMarks zostanie zaktualizowany do 170, a nowy dokument subjectData zostanie przeniesiony do pola tablicy „subjectDetails” .