1. Przegląd
MongoDB to zorientowana na dokumenty baza danych NoSQL, która jest publicznie dostępna. Możemy aktualizować dokumenty w kolekcji za pomocą różnych metod, takich jak aktualizacja , zamień i zapisz . Aby zmienić określone pole dokumentu, użyjemy różnych operatorów, takich jak $set , $inc, itp.
W tym samouczku nauczymy się modyfikować wiele pól dokumentu za pomocą aktualizacji i zamień zapytanie. W celach demonstracyjnych najpierw omówimy zapytanie powłoki mongo, a następnie odpowiednią implementację w Javie.
Przyjrzyjmy się teraz różnym metodom osiągnięcia tego celu.
2. Zapytanie powłoki do aktualizacji różnych pól
Zanim zaczniemy, utwórzmy najpierw nową bazę danych, baeldung oraz zbiór próbek, pracownik . Użyjemy tej kolekcji we wszystkich przykładach:
use baeldung;
db.createCollection(employee);
Dodajmy teraz kilka dokumentów do tej kolekcji za pomocą insertMany zapytanie:
db.employee.insertMany([
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Representative",
"department_id": 2,
"salary": 20000,
"hire_date": NumberLong("1643969311817")
},
{
"employee_id": 794876,
"employee_name": "Joe Butler",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1645338658000")
}
]);
W rezultacie otrzymamy JSON z ObjectId dla obu dokumentów, jak pokazano poniżej:
{
"acknowledged": true,
"insertedIds": [
ObjectId("6211e034b76b996845f3193d"),
ObjectId("6211e034b76b996845f3193e")
]
}
Do tej pory stworzyliśmy wymagane środowisko. Zaktualizujmy teraz dokumenty, które właśnie wstawiliśmy.
2.1. Zaktualizuj wiele pól pojedynczego dokumentu
Możemy użyć $set i $inc operatorów do aktualizacji dowolnego pola w MongoDB. Zestaw $ operator ustawi nowo określoną wartość, podczas gdy $inc operator zwiększy wartość o określoną wartość.
Przyjrzyjmy się najpierw zapytaniu MongoDB, aby zaktualizować dwa pola zbioru pracowników za pomocą $set operator:
db.employee.updateOne(
{
"employee_id": 794875,
"employee_name": "David Smith"
},
{
$set:{
department_id:3,
job:"Sales Manager"
}
}
);
W powyższym zapytaniu employee_id i nazwa_pracownika pole służy do filtrowania dokumentu i $set operator służy do aktualizowania zadania i identyfikator_działu pola.
Możemy również użyć zestawu $ i $inc operatorów razem w jednym zapytaniu aktualizacyjnym:
db.employee.updateOne(
{
"employee_id": 794875
},
{
$inc: {
department_id: 1
},
$set: {
job: "Sales Manager"
}
}
);
To zaktualizuje zadanie na Menedżera sprzedaży i zwiększ department_id przez 1.
2.2. Zaktualizuj wiele pól wielu dokumentów
Ponadto możemy również zaktualizować wiele pól więcej niż jednego dokumentu w MongoDB. Po prostu musimy uwzględnić opcję multi:true aby zmodyfikować wszystkie dokumenty, które pasują do kryteriów zapytania filtra:
db.employee.update(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
},
{
multi: true
}
);
Alternatywnie uzyskamy te same wyniki za pomocą updateMany zapytanie:
db.employee.updateMany(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
}
);
W powyższym zapytaniu użyliśmy updateMany metoda aktualizacji więcej niż 1 dokumentu z kolekcji.
2.3. Częsty problem podczas aktualizacji wielu pól
Do tej pory nauczyliśmy się aktualizować wiele pól za pomocą zapytania aktualizującego, udostępniając dwa różne operatory lub używając jednego operatora na wielu polach.
Teraz, jeśli użyjemy operatora wiele razy z różnymi polami w jednym zapytaniu, MongoDB zaktualizuje tylko ostatnią instrukcję zapytania aktualizującego i zignoruj resztę:
db.employee.updateMany(
{
"employee_id": 794875
},
{
$set: {
department_id: 3
},
$set: {
job:"Sales Manager"
}
}
);
Powyższe zapytanie zwróci podobny wynik do tego:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
W tym przypadku jedyna praca zostanie zaktualizowany do „Menedżera sprzedaży”. identyfikator_działu wartość nie zostanie zaktualizowana do 3.
3. Zaktualizuj pola za pomocą sterownika Java
Do tej pory omówiliśmy surowe zapytania MongoDB. Przeprowadźmy teraz te same operacje w Javie. Sterownik MongoDB Java obsługuje dwie klasy reprezentujące dokument MongoDB, com.mongodb.BasicDBObject i org.bson.Document. Przyjrzymy się obu metodom aktualizacji pól w dokumencie.
Zanim przejdziemy dalej, najpierw połączmy się z pracownikiem kolekcja wewnątrz baeldung DB:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");
Tutaj założyliśmy, że MongoDB działa lokalnie na domyślnym porcie 27017.
3.1. Korzystanie z DBObject
Aby utworzyć dokument w MongoDB, użyjemy com.mongodb. Interfejs DBObject i jego klasa implementacyjna com.mongodb.BasicDBObject .
Implementacja DBObject opiera się na parach klucz-wartość. BasicDBObject jest dziedziczona z LinkedHashMap klasa, która znajduje się w util pakiet.
Użyjmy teraz com.mongodb.BasicDBObject aby wykonać operację aktualizacji na wielu polach:
BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);
Tutaj najpierw stworzyliśmy zapytanie filtrujące na podstawie employee_id. Ta operacja zwróci zestaw dokumentów. Ponadto zaktualizowaliśmy wartość department_id i praca zgodnie z ustawionym zapytaniem.
3.2. Korzystanie z bson Dokument
Możemy wykonać wszystkie operacje MongoDB za pomocą bson dokument. W tym celu najpierw potrzebujemy obiektu kolekcji, a następnie wykonujemy operację aktualizacji za pomocą updateMany metoda z filtrem i ustaw funkcje.
UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));
Tutaj przekazujemy filtr zapytań do updateMany metoda. równ filtruj dopasowania employee_id z dokładnie dopasowanym tekstem „794875”. Następnie aktualizujemy department_id i praca za pomocą zestawu operatora.
4. Używanie Zamień zapytanie
Naiwnym podejściem do aktualizowania wielu pól dokumentu jest zastąpienie go nowym dokumentem ze zaktualizowanymi wartościami.
Na przykład, jeśli chcemy zastąpić dokument employee_id 794875, możemy wykonać następujące zapytanie:
db.employee.replaceOne(
{
"employee_id": 794875
},
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1643969311817")
}
);
Powyższe polecenie spowoduje wydrukowanie potwierdzenia JSON w danych wyjściowych:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Tutaj employee_id pole służy do filtrowania dokumentu. Drugi argument zapytania aktualizującego oznacza dokument, z którego istniejący dokument zostanie zastąpiony.
W powyższym zapytaniu wykonujemy replaceOne , w związku z tym zastąpi tylko jeden dokument tym filtrem. Alternatywnie, jeśli chcemy zastąpić wszystkie dokumenty tym zapytaniem filtrującym, musielibyśmy użyć updateMany metoda.