1. Przegląd
MongoDB to wieloplatformowa, zorientowana na dokumenty baza danych NoSQL typu open source, napisana w C++. Ponadto MongoDB zapewnia wysoką wydajność, wysoką dostępność i automatyczne skalowanie.
Aby zaktualizować dokumenty w MongoDB, możemy użyć różnych metod, takich jak updateOne , znajdźOneAndUpdate, itp. Ponadto MongoDB udostępnia różne operatory metod aktualizacji.
W tym samouczku omówimy różne podejścia do wykonywania operacji aktualizacji w MongoDB. Dla każdego podejścia najpierw omówimy zapytanie powłoki mongo, a następnie jego implementację w Javie.
2. Konfiguracja bazy danych
Zanim przejdziemy do zapytań aktualizujących, utwórzmy najpierw bazę danych, baeldung oraz zbiór próbek, uczeń:
use baeldung;
db.createCollection(student);
Jako ilustrację dodajmy kilka dokumentów do kolekcji student za pomocą insertMany zapytanie:
db.student.insertMany([
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 1",
"age": 16,
"roll_no":199406
},
{
"student_id": 8765,
"student_name": "Andrew Boult",
"address": "Hostel 2",
"age": 18,
"roll_no":199408
}
]);
Po udanym wstawieniu otrzymamy JSON z acknowledged:true :
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("621b078485e943405d04b557"),
ObjectId("621b078485e943405d04b558")
]
}
Przyjrzyjmy się teraz różnym sposobom aktualizowania dokumentów w MongoDB.
3. Korzystanie z updateOne Metoda
Operację aktualizacji w MongoDB można wykonać poprzez dodanie nowego pola, usunięcie pola lub aktualizację istniejącego pola. updateOne Metoda aktualizuje pojedynczy dokument w kolekcji na podstawie zastosowanego filtru zapytania. Najpierw znajduje dokument, który pasuje do filtra, a następnie aktualizuje określone pola.
Ponadto możemy używać różnych operatorów, takich jak $set , $nieskonfigurowane , $inc itp. za pomocą metody aktualizacji.
Aby to zademonstrować, przyjrzyjmy się zapytaniu, aby zaktualizować pojedynczy dokument z kolekcji:
db.student.updateOne(
{
"student_name" : "Paul Starc"
},
{
$set: {
"address" : "Hostel 2"
}
}
);
Otrzymamy wynik podobny do pokazanego poniżej:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Sprawdźmy teraz kod sterownika Java powyższego updateOne zapytanie:
UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));
Tutaj najpierw użyliśmy nazwa_ucznia pole do filtrowania dokumentów. Następnie aktualizujemy adres dokumentu o nazwa_ucznia „Paweł Starc”.
4. Korzystanie z updateMany Metoda
aktualizacjaWiele Metoda aktualizuje wszystkie dokumenty w kolekcjach MongoDB, które pasują do podanego filtra. Jedna z zalet korzystania z updateMany jest to, że możemy aktualizować wiele dokumentów bez utraty pól starych dokumentów.
Zobaczmy zapytanie powłoki MongoDB przy użyciu updateMany metoda:
db.student.updateMany(
{
age: {
$lt: 20
}
},
{
$set:{
"Review" : true
}
}
);
Powyższe polecenie zwróci następujące dane wyjściowe:
{
"acknowledged":true,
"matchedCount":2,
"modifiedCount":2
}
Tutaj matchedCount zawiera liczbę dopasowanych dokumentów, natomiast modifiedCount zawiera zmodyfikowany numer dokumentu.
Przyjrzyjmy się teraz kodowi sterownika Java za pomocą updateMany metoda:
UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));
Tutaj wszystkie dokumenty z wikiem mniej niż 20 zostanie przefiltrowanych, a Recenzja pole zostanie ustawione na prawda .
5. Korzystanie z replaceOne Metoda
replaceOne metoda MongoDB zastępuje cały dokument. Jedna z wad replaceOne jest to, że wszystkie starsze pola zostaną zastąpione nowymi polami, a starsze pola również zostaną utracone:
db.student.replaceOne(
{
"student_id": 8764
},
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
}
);
W takim przypadku otrzymamy następujące dane wyjściowe:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Jeśli nie zostaną znalezione żadne dopasowania, operacja zwraca matchedCount jako 0:
{
"acknowledged":true,
"matchedCount":0,
"modifiedCount":0
}
Napiszmy odpowiedni kod sterownika Java za pomocą replaceOne metoda:
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age",18)
.append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);
W powyższym kodzie stworzyliśmy dokument, którym zostanie zastąpiony starszy dokument. Dokument z student_id 8764 zostanie zastąpione nowo utworzonym dokumentem.
6. Korzystanie z funkcji findOneAndReplace Metoda
znajdźOneAndReplace Metoda jest jedną z zaawansowanych metod aktualizacji dostarczanych przez MongoDB i zastępuje pierwszy dopasowany dokument na podstawie podanych kryteriów wyboru. Domyślnie ta metoda zwraca oryginalny dokument. Możemy użyć różnych opcji findOneAndReplace w razie potrzeby sortować i projektować dokumenty.
Krótko mówiąc, znajdźOneAndReplace zastępuje pierwszy pasujący dokument z kolekcji na podstawie zastosowanego filtra:
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
returnNewDocument: false
}
);
To zapytanie zwróci następujący dokument:
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 1",
"age":16,
"roll_no":199406
}
Jeśli ustawimy returnNewDocument aby prawda , operacja zwróci zastąpiony dokument:
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 2",
"age":18,
"roll_no":199406
}
Użyjmy teraz findOneAndReplace metoda wyświetlania student_id i wiek pola w zwróconym dokumencie:
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
projection: {
"_id" : 0,
"student_id":1,
"age" : 1
}
}
);
Wynik powyższego zapytania będzie zawierał tylko przewidywane pola:
{
"student_id":"8764",
"age":16
}
Kod sterownika Java powyższego zapytania z różnymi opcjami findOneAndReplace:
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age", 18)
.append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
Filters.eq("student_id", 8764),
replaceDocument,
new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));
W powyższym zapytaniu findOneAndReplace metoda najpierw posortuje dokumenty w kolejności rosnącej na podstawie roll_no, a nowo utworzony dokument zastępuje dokument student_id „8764”.
7. Korzystanie z findOneAndUpdate Metoda
findOneAndUpdate Metoda aktualizuje pierwszy pasujący dokument w kolekcji. Jeśli więcej niż jeden dokument spełnia kryteria wyboru, aktualizuje tylko pierwszy zgodny dokument. Kiedy aktualizujemy dokument, wartość _id pole pozostaje niezmienione:
db.student.findOneAndUpdate(
{
"student_id" : 8764
},
{
$inc : {
"roll_no" : 5
}
},
{
sort: {
"roll_no" : 1
},
projection: {
"_id" : 0,
"student_id":1,
"address" : 1
}
}
);
Wynik zapytania będzie zawierał tylko identyfikator studenta i adres starszego dokumentu:
{
"student_id":8764,
"address":"Hostel 1"
}
Kod sterownika Java powyższego zapytania, przy użyciu różnych opcji findOneAndUpdate wygląda następująco:
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
Filters.eq("student_id", 8764),
Updates.inc("roll_no", 5),
new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));
W takim przypadku findOneAndUpdate metoda najpierw posortuje dokument w kolejności rosnącej na podstawie roll_no . Powyższe zapytanie zwiększa roll_no o 5, a następnie zwraca identyfikator studenta i adres pola.