1. Úvod
V tomto tutoriálu se podíváme na BSON a na to, jak jej můžeme použít k interakci s MongoDB.
Nyní podrobný popis MongoDB a všech jeho schopností přesahuje rozsah tohoto článku. Bude však užitečné porozumět několika klíčovým pojmům.
MongoDB je distribuovaný nástroj pro ukládání dokumentů NoSQL. Dokumenty jsou uloženy jako data BSON a seskupeny do kolekcí. Dokumenty v kolekci jsou analogické s řádky v tabulce relační databáze .
Pro podrobnější pohled se podívejte na úvodní článek MongoDB.
2. Co je BSON ?
BSON je zkratka pro Binary JSON . Je to protokol pro binární serializaci dat podobných JSON.
JSON je formát pro výměnu dat, který je oblíbený v moderních webových službách. Poskytuje flexibilní způsob, jak reprezentovat složité datové struktury.
BSON poskytuje několik výhod oproti použití běžného JSON:
- Kompaktní:Ve většině případů vyžaduje uložení struktury BSON méně místa než její ekvivalent JSON
- Typy dat:BSON poskytuje další typy dat nenajdete v běžném JSON, jako je Datum a BinData
Jednou z hlavních výhod používání BSON je snadné procházení . Dokumenty BSON obsahují další metadata, která umožňují snadnou manipulaci s poli dokumentu, aniž byste museli číst celý dokument samotný.
3. Ovladač MongoDB
Nyní, když máme základní znalosti o BSON a MongoDB, pojďme se podívat na to, jak je používat společně. Zaměříme se na hlavní akce ze zkratky CRUD (C reate, R ead, U pdate, D elete).
MongoDB poskytuje softwarové ovladače pro většinu moderních programovacích jazyků. Ovladače jsou založeny na knihovně BSON , což znamená, že při vytváření dotazů budeme pracovat přímo s BSON API. Další informace naleznete v našem průvodci dotazovacím jazykem MongoDB.
V této části se podíváme na použití ovladače pro připojení ke clusteru a použití BSON API k provádění různých typů dotazů. Všimněte si, že ovladač MongoDB poskytuje Filtry třída, která nám může pomoci napsat kompaktnější kód. V tomto tutoriálu se však zaměříme výhradně na použití základního rozhraní BSON API.
Jako alternativu k přímému použití ovladače MongoDB a BSON se podívejte na našeho průvodce Spring Data MongoDB.
3.1. Připojování
Chcete-li začít, nejprve přidáme ovladač MongoDB jako závislost do naší aplikace:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>3.10.1</version>
</dependency>
Poté vytvoříme připojení k databázi a kolekci MongoDB:
MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("myDB");
MongoCollection<Document> collection = database.getCollection("employees");
Zbývající části se budou zabývat vytvářením dotazů pomocí kolekce odkaz.
3.2. Vložit
Řekněme, že máme následující JSON, který chceme vložit jako nový dokument do zaměstnanců kolekce:
{
"first_name" : "Joe",
"last_name" : "Smith",
"title" : "Java Developer",
"years_of_service" : 3,
"skills" : ["java","spring","mongodb"],
"manager" : {
"first_name" : "Sally",
"last_name" : "Johanson"
}
}
Tento příklad JSON ukazuje nejběžnější datové typy, se kterými se můžeme setkat u dokumentů MongoDB:textové, číselné, pole a vložené dokumenty.
K vložení pomocí BSON bychom použili Dokument MongoDB API:
Document employee = new Document()
.append("first_name", "Joe")
.append("last_name", "Smith")
.append("title", "Java Developer")
.append("years_of_service", 3)
.append("skills", Arrays.asList("java", "spring", "mongodb"))
.append("manager", new Document()
.append("first_name", "Sally")
.append("last_name", "Johanson"));
collection.insertOne(employee);
Dokument class je primární API používané v BSON. Rozšiřuje mapu Java rozhraní a obsahuje několik přetížených metod. To usnadňuje práci s nativními typy i běžnými objekty, jako jsou ID objektů, data a seznamy.
3.3. Najít
Chcete-li najít dokument v MongoDB, poskytujeme vyhledávací dokument, který určuje, na která pole se má dotazovat. Například k vyhledání všech dokumentů, které mají příjmení „Smith“, bychom použili následující dokument JSON:
{
"last_name": "Smith"
}
Napsáno v BSON by to bylo:
Document query = new Document("last_name", "Smith");
List results = new ArrayList<>();
collection.find(query).into(results);
Dotazy „Najít“ mohou přijímat více polí a výchozím chováním je použití logického a operátora, aby je spojil. To znamená, že budou vráceny pouze dokumenty, které odpovídají všem polím .
Chcete-li to obejít, MongoDB poskytuje nebo operátor dotazu:
{
"$or": [
{ "first_name": "Joe" },
{ "last_name":"Smith" }
]
}
Najde všechny dokumenty, které mají buď křestní jméno „Joe“ nebo příjmení „Smith“. Abychom to zapsali jako BSON, použili bychom vnořený Dokument stejně jako výše uvedený vkládací dotaz:
Document query =
new Document("$or", Arrays.asList(
new Document("last_name", "Smith"),
new Document("first_name", "Joe")));
List results = new ArrayList<>();
collection.find(query).into(results);
3.4. Aktualizovat
Aktualizační dotazy se v MongoDB trochu liší, protože vyžadují dva dokumenty :
- Kritéria filtru pro nalezení jednoho nebo více dokumentů
- Aktualizační dokument určující, která pole se mají upravit
Řekněme například, že chceme přidat „bezpečnostní“ dovednost každému zaměstnanci, který již „jarní“ dovednost má. První dokument najde všechny zaměstnance s „jarními“ dovednostmi a druhý přidá do pole dovedností novou položku „bezpečnost“.
V JSON by tyto dva dotazy vypadaly takto:
{
"skills": {
$elemMatch: {
"$eq": "spring"
}
}
}
{
"$push": {
"skills": "security"
}
}
A v BSON by to byly:
Document query = new Document(
"skills",
new Document(
"$elemMatch",
new Document("$eq", "spring")));
Document update = new Document(
"$push",
new Document("skills", "security"));
collection.updateMany(query, update);
3.5. Smazat
Odstranění dotazů v MongoDB používá stejnou syntaxi jako vyhledávací dotazy. Jednoduše poskytujeme dokument, který specifikuje jedno nebo více kritérií, která se mají shodovat.
Řekněme například, že jsme našli chybu v naší databázi zaměstnanců a omylem vytvořili zaměstnance se zápornou hodnotou za roky služby. Abychom je našli všechny, použili bychom následující JSON:
{
"years_of_service" : {
"$lt" : 0
}
}
Ekvivalentní dokument BSON by byl:
Document query = new Document(
"years_of_service",
new Document("$lt", 0));
collection.deleteMany(query);