sql >> Databáze >  >> NoSQL >> MongoDB

Jak provádět základní operace dotazů v MongoDB

V tomto článku se budeme zabývat tím, jak provádět základní operace dotazů v MongoDB. Po globálním rozšíření internetu nyní produkujeme data nesrovnatelným tempem. Vzhledem k tomu, že to bude vyžadovat, abychom shromáždili/vyžádali si požadovaná data z databáze, abychom provedli nějaký druh analýzy, je nanejvýš důležité, abychom zvolili správný nástroj k dotazování na data.

Zde přichází na scénu MongoDB, konkrétně. MongoDB je nestrukturovaná databáze, která ve formě dokumentů ukládá data. Kromě toho je MongoDB velmi efektivní při manipulaci s obrovským množstvím dat a je nejběžněji používanou NoSQL databází, protože poskytuje bohatý dotazovací jazyk a všestranný a snadný přístup k datům.

Vytvoření ukázkové databáze

Před začátkem vytvoříme ukázkovou DB s několika ukázkovými daty pro provedení všech operací.

Vytvoříme databázi s názvem myDB a vytvoří kolekci s názvem objednávky . Za tímto účelem by prohlášení bylo následující.

> use myDB
> db.createCollection("orders")
>

MongoDB nepoužívá řádky a sloupce. Ukládá data ve formátu dokumentu. Sbírka je skupina dokumentů.

Všechny kolekce v databázi můžete zkontrolovat pomocí následujícího příkazu.

> use myDB
>show collections
orders
system.indexes
>

Pojďme vložit nějaké dokumenty pomocí následujícího příkazu.

> db.orders.insert([
	{
		Customer: "abc",
		Address:{"City":"Jaipur","Country":"India"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 1000.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		Customer: "xyz",
		Address:{"City":"Delhi","Country":"India"},
		PaymentMode":"Cash",
		OrderTotal: 800.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		Customer: "ron",
		Address:{"City":"New York","Country":"USA"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 800.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":00}
		]		
	}
])

Dokument je ekvivalentem řádku RDBMS. Nemusí mít v každém dokumentu stejné schéma. Znamená to, že dokument nemusí mít žádné pole, které nemá žádnou hodnotu.

Dotaz na dokumenty

metoda find()

K dotazování na dokumenty z kolekcí MongoDB musíte použít metodu find(). Následující příkaz načte všechny dokumenty z kolekce.

> db.orders.find()
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		Address:{"City":"Jaipur","Country":"India"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 1000.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		Address:{"City":"Delhi","Country":"India"},
		PaymentMode":"Cash",
		OrderTotal: 800.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		Address:{"City":"New York","Country":"USA"},
		PaymentMode":"Card",
		Email:"[email protected]",
		OrderTotal: 600.00,
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":00}
		]
	}
>

Projekce

Pokud chcete načíst pouze vybraná pole, můžete použít projekci. Následující příkaz načte pouze zákazníka a E-mail pole.

> db.orders.find( { }, { Customer: 1, Email: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		Email:"[email protected]"
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz"		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		Email:"[email protected]"		
	}
>

Filtrování dokumentů zadáním podmínky

Nyní se naučíme, jak můžeme načíst dokumenty, které odpovídají zadané podmínce. MongoDB k tomu poskytuje mnoho operátorů porovnání.

1. $eq operátor

Operátor $eq kontroluje rovnost hodnoty pole se zadanou hodnotou. Chcete-li načíst objednávku, kde je PaymentMode je 'Karta', můžete použít následující výpis

>db.orders.find( { PaymentMode: { $eq: "Card" } } )

Tento dotaz lze napsat také jako níže

>db.orders.find( { PaymentMode: "Card" } )

Podobný příkaz SQL by byl následující

SELECT * FROM orders WHERE PaymentMode="Card"

Příklad

>db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		PaymentMode":"Card"				
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		PaymentMode":"Card"
	}
>

Operátor $eq s vloženým dokumentem

Možná jste si všimli, že jsme vložili vložený dokument Adresa v části Objednávky sbírka. Pokud chcete objednávku načíst, kde je Země je 'Indie', můžete použít tečkovou notaci jako v následujícím prohlášení.

>db.Orders.find( { "Address.Country": { $eq: "India" } } )

Tento dotaz lze napsat také jako níže

>db.Orders.find( { "Address.Country":"India" } )

Příklad

>db.Orders.find( { "Address.Country": { $eq: "India" } } , { Customer: 1, Address: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		Address:{"City":"Jaipur","Country":"India"}
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		Address:{"City":"Delhi","Country":"India"}
	}
>

Operátor $eq s polem

Operátor $eq načte všechny dokumenty, pokud zadaná podmínka platí pro jakoukoli položku v poli. Máme OrderItems pole v dokumentu. Pokud chcete filtrovat dokumenty, kde byl také objednán 'papír', pak by výpis vypadal následovně.

>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )

Tento dotaz lze napsat také jako níže

>db.Orders.find( { "OrderItems.ItemName": "paper"  } )

Příklad

>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } , { Customer: 1, OrderItems: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]
	}
>

2. $gt operátor

Operátor $gt můžete použít k načtení dokumentů, kde je hodnota pole větší než zadaná hodnota. Následující příkaz načte dokumenty, kde je OrderTotal je větší než 800.

>db.orders.find( { OrderTotal: { $gt: 800.00 } } )

Podobný příkaz SQL by byl následující

SELECT * FROM orders WHERE OrderTotal>800.00

Příklad

>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderTotal: 1000.00
	}
>

3. $gte operátor

Operátor $gte můžete použít k načtení dokumentů, kde je hodnota pole větší nebo rovna zadané hodnotě. Následující příkaz načte dokumenty, kde je OrderTotal je větší nebo rovno 800.

>db.orders.find( { OrderTotal: { $gte: 800.00 } } )

Podobný příkaz SQL by byl následující

SELECT * FROM orders WHERE OrderTotal>=800.00

Příklad

>db.Orders.find( { "OrderTotal": { $gte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderTotal: 1000.00
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderTotal: 800.00
	}
>

4. $lt operátor

Operátor $lt můžete použít k načtení dokumentů, kde je hodnota pole menší než zadaná hodnota. Následující příkaz načte dokumenty, kde je OrderTotal je méně než 800.

>db.orders.find( { OrderTotal: { $lt: 800.00 } } )

Podobný příkaz SQL by byl následující

SELECT * FROM orders WHERE OrderTotal<800.00

Příklad

>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderTotal: 600.00
	}
>

4. $lte operátor

Operátor $lte můžete použít k načtení dokumentů, kde je hodnota pole menší nebo rovna zadané hodnotě. Následující příkaz načte dokumenty, kde je OrderTotal je menší nebo roven 800.

>db.orders.find( { OrderTotal: { $lte: 800.00 } } )

Podobný příkaz SQL by byl následující

SELECT * FROM orders WHERE OrderTotal<=800.00

Příklad

>db.Orders.find( { "OrderTotal": { $lte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderTotal: 800.00
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderTotal: 600.00
	}
>

5. $ne operátor

Operátor $ne můžete použít k načtení dokumentů, kde hodnota pole není rovna zadané hodnotě.

>db.orders.find( { PaymentMode: { $ne: "Card" } } )

Podobný příkaz SQL by byl následující

SELECT * FROM orders WHERE PaymentMode != "Card"

Příklad

>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		PaymentMode":"Cash"
	}
>

6. $in operátor

Operátor $in můžete použít k načtení dokumentů, kde je hodnota pole rovna jakékoli hodnotě v zadaném poli.

>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )

Příklad

>db.Orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
		Customer: "abc",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":10},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"journal","Price":"200.00","Qty":2},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]		
	},
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
		Customer: "xyz",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"paper","Price":"10.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":500}
		]
	}
>

7. $nin operátor

Operátor $nin můžete použít k načtení dokumentů, kde hodnota pole není rovna žádné hodnotě v zadaném poli. Vybere také dokumenty, kde pole neexistuje.

>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )

Příklad

>db.Orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
	{
		"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
		Customer: "ron",
		OrderItems:[
			{"ItemName":"notebook","Price":"150.00","Qty":5},
			{"ItemName":"postcard","Price":"10.00","Qty":00}
		]
	}
>

Indexování

Víme, že indexování je velmi důležité, pokud provádíme dotazy na velké databázi. Bez indexování může být provedení dotazu nákladné. Pomocí následujícího příkazu můžeme přidat jednoduchý vzestupný index na jedno pole.

>db.Orders.createIndex({"Customer":1})

MongoDB ve výchozím nastavení vytváří jedinečný index v poli „_id“. Jedinečný index zabrání vložení dvou dokumentů se stejnou hodnotou pro toto pole. Pokud chcete vytvořit jedinečný index, příkaz bude následující.

db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )

Závěr

Doufám, že jste se dnes naučili něco nového. Pokud se chcete dozvědět pár dalších věcí o MongoDB, zde je zajímavý článek o MongoDB s vlastním hostitelem. Také vás zvu, abyste si věci vyzkoušeli sami a podělili se o své zkušenosti v sekci komentářů. Kromě toho, pokud narazíte na nějaké problémy s některou z výše uvedených definic, neváhejte se mě zeptat v komentářích níže.


  1. Jak používat datové modelování MongoDB ke zlepšení propustnosti operací

  2. Připojení MongoDB z mobilní aplikace nebo aplikace založené na prohlížeči

  3. Automatizace kontroly konfigurace databáze

  4. MongoDB $lookup Objectid získat prázdné pole?