1. Přehled
MongoDB je dokumentově orientovaná NoSQL databáze, která je veřejně dostupná. Dokumenty v kolekci můžeme aktualizovat pomocí různých metod, jako je aktualizace , nahradit a uložit . Abychom mohli změnit konkrétní pole dokumentu, použijeme různé operátory jako $set , $inc, atd.
V tomto tutoriálu se naučíme upravovat více polí dokumentu pomocí aktualizace a nahradit dotaz. Pro demonstrační účely nejprve probereme dotaz mongo shell a poté jeho odpovídající implementaci v Javě.
Pojďme se nyní podívat na různé metody, jak tohoto účelu dosáhnout.
2. Shell Query pro aktualizaci různých polí
Než začneme, nejprve vytvořte novou databázi baeldung a ukázková kolekce zaměstnanec . Tuto kolekci použijeme ve všech příkladech:
use baeldung;
db.createCollection(employee);
Pojďme nyní do této kolekce přidat několik dokumentů pomocí insertMany dotaz:
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")
}
]);
V důsledku toho získáme JSON s ObjectId pro oba dokumenty, jak je uvedeno níže:
{
"acknowledged": true,
"insertedIds": [
ObjectId("6211e034b76b996845f3193d"),
ObjectId("6211e034b76b996845f3193e")
]
}
Zatím jsme nastavili požadované prostředí. Pojďme nyní aktualizovat dokumenty, které jsme právě vložili.
2.1. Aktualizace více polí jednoho dokumentu
Můžeme použít $set a $inc operátory k aktualizaci libovolného pole v MongoDB. $set operátor nastaví nově zadanou hodnotu, zatímco $inc operátor zvýší hodnotu o zadanou hodnotu.
Nejprve se podíváme na dotaz MongoDB, abychom aktualizovali dvě pole sbírky zaměstnanců pomocí $set operátor:
db.employee.updateOne(
{
"employee_id": 794875,
"employee_name": "David Smith"
},
{
$set:{
department_id:3,
job:"Sales Manager"
}
}
);
Ve výše uvedeném dotazu id_employee a jméno_zaměstnance pole se používá k filtrování dokumentu a $set operátor se používá k aktualizaci úlohy a id_oddělení pole.
Můžeme také použít $set a $inc operátory společně v jediném aktualizačním dotazu:
db.employee.updateOne(
{
"employee_id": 794875
},
{
$inc: {
department_id: 1
},
$set: {
job: "Sales Manager"
}
}
);
Tím se aktualizuje úloha pole na Sales Manager a zvyšte department_id do 1.
2.2. Aktualizovat více polí více dokumentů
Kromě toho můžeme také aktualizovat více polí více než jednoho dokumentu v MongoDB. Jednoduše musíme zahrnout možnost multi:true chcete-li upravit všechny dokumenty, které odpovídají kritériím dotazu filtru:
db.employee.update(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
},
{
multi: true
}
);
Případně stejné výsledky získáme pomocí updateMany dotaz:
db.employee.updateMany(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
}
);
Ve výše uvedeném dotazu jsme použili updateMany způsob aktualizace více než 1 dokumentu sbírky.
2.3. Běžný problém při aktualizaci více polí
Dosud jsme se naučili aktualizovat více polí pomocí aktualizačního dotazu poskytnutím dvou různých operátorů nebo použitím jednoho operátoru pro více polí.
Pokud nyní použijeme operátor vícekrát s různými poli v jednom dotazu, MongoDB aktualizuje pouze poslední příkaz aktualizačního dotazu a zbytek ignorujte:
db.employee.updateMany(
{
"employee_id": 794875
},
{
$set: {
department_id: 3
},
$set: {
job:"Sales Manager"
}
}
);
Výše uvedený dotaz vrátí výstup podobný tomuto:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
V tomto případě jediná úloha bude aktualizován na „Sales Manager“. ID_oddělení hodnota nebude aktualizována na 3.
3. Aktualizujte pole pomocí ovladače Java
Dosud jsme diskutovali o nezpracovaných dotazech MongoDB. Proveďme nyní stejné operace pomocí Javy. Ovladač MongoDB Java podporuje dvě třídy reprezentující dokument MongoDB, com.mongodb.BasicDBObject a org.bson.Document. Podíváme se na obě metody aktualizace polí v dokumentu.
Než budeme pokračovat, nejprve se připojte k zaměstnanci kolekce uvnitř baeldung DB:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");
Zde jsme předpokládali, že MongoDB běží lokálně na výchozím portu 27017.
3.1. Pomocí DBObject
K vytvoření dokumentu v MongoDB použijeme com.mongodb. Rozhraní DBObject a jeho implementační třída com.mongodb.BasicDBObject .
Implementace DBObject je založeno na párech klíč–hodnota. The BasicDBObject je zděděno z LinkedHashMap třídy, která je v util balíček.
Nyní použijeme com.mongodb.BasicDBObject pro provedení operace aktualizace na více polích:
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);
Zde jsme nejprve vytvořili filtrační dotaz na základě id_zaměstnance. Tato operace vrátí sadu dokumentů. Dále jsme aktualizovali hodnotu department_id a zaměstnání podle nastaveného dotazu.
3.2. Pomocí bson Dokument
Všechny operace MongoDB můžeme provádět pomocí bson dokument. K tomu nejprve potřebujeme objekt kolekce a poté provedeme operaci aktualizace pomocí updateMany pomocí filtru a nastavit funkce.
UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));
Zde předáváme filtr dotazů do updateMany metoda. ekv filtr odpovídá id_employee s přesně odpovídajícím textem „794875“. Poté aktualizujeme id_oddělení a zaměstnání pomocí sady operátor.
4. Pomocí Nahradit dotaz
Naivní přístup k aktualizaci více polí dokumentu je nahradit jej novým dokumentem, který má aktualizované hodnoty.
Například pokud chceme nahradit dokument řetězcem employee_id 794875, můžeme provést následující dotaz:
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")
}
);
Výše uvedený příkaz vytiskne na výstupu JSON potvrzení:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Zde je id_zaměstnance pole se používá k filtrování dokumentu. Druhý argument aktualizačního dotazu označuje dokument, ze kterého bude stávající dokument nahrazen.
Ve výše uvedeném dotazu provádíme replaceOne , tedy nahradí tímto filtrem pouze jeden dokument. Případně, pokud chceme nahradit všechny dokumenty tímto filtrovacím dotazem, pak bychom museli použít updateMany metoda.