MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да извършвате основни операции със заявка в MongoDB

В тази статия ще разгледаме как да изпълняваме основни операции със заявка в MongoDB. Ние произвеждаме данни с несравнимо темпо сега след глобалното разпространение на интернет. Тъй като това ще изисква от нас да съберем/искаме необходимите данни от базата данни, за да извършим някакъв вид анализ, от изключително значение е да изберем правилния инструмент за запитване на данните.

Това е мястото, където MongoDB идва по-специално. MongoDB е неструктурирана база данни, която под формата на документи съхранява данни. В допълнение, MongoDB е много ефективен при боравене с огромни количества данни и е най-често използваната NoSQL база данни, тъй като предоставя богат език за заявки и гъвкав и лесен достъп до данни.

Създаване на примерна база данни

Преди да започнем, ще създадем примерна БД с някои примерни данни за изпълнение на всички операции.

Ще създадем база данни с име myDB и ще създаде колекция с име поръчки . За това изявлението ще бъде както следва.

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

MongoDB не използва редовете и колоните. Той съхранява данните във формат на документ. Колекция е група документи.

Можете да проверите всички колекции в база данни, като използвате следния израз.

> use myDB
>show collections
orders
system.indexes
>

Нека вмъкнем някои документи, като използваме следното изявление.

> 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}
		]		
	}
])

Документът е еквивалент на ред на RDBMS. Не е необходимо да има една и съща схема във всеки документ. Това означава, че документът може да няма поле, което да няма стойност.

Документи за заявка

метод find()

Трябва да използвате метода find(), за да заявите документи от колекции на MongoDB. Следното изявление ще извлече всички документи от колекцията.

> 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}
		]
	}
>

Проекция

Ако искате да извлечете само избрани полета, тогава можете да използвате проекцията. Следното изявление ще извлече само Клиент и Имейл поле.

> 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]"		
	}
>

Филтрирайте документите чрез посочване на условие

Сега ще научим как можем да извлечем документите, които отговарят на определено условие. MongoDB предоставя много оператори за сравнение за това.

1. $eq оператор

Операторът $eq проверява равенството на стойността на полето с посочената стойност. За да извлечете поръчката, където PaymentMode е „Карта“, можете да използвате следното изявление

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

Тази заявка може да бъде написана и както по-долу

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

Подобен SQL израз би бил както следва

SELECT * FROM orders WHERE PaymentMode="Card"

Пример

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

Оператор $eq с вграден документ

Може да сте забелязали, че вмъкнахме вграден документ Адрес в Поръчки колекция. Ако искате да извлечете поръчката, където Държава е „Индия“, можете да използвате нотация с точки като следното изявление.

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

Тази заявка може да бъде написана и както по-долу

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

Пример

>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"}
	}
>

Оператор $eq с масив

Операторът $eq ще извлече всички документи, ако посоченото условие е вярно за който и да е елемент от масив. Имаме OrderItems масив в документа. Ако искате да филтрирате документите, където е поръчана и „хартия“, тогава изявлението ще бъде както следва.

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

Тази заявка може да бъде написана и както по-долу

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

Пример

>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 оператор

Можете да използвате оператора $gt, за да извлечете документите, където стойността на полето е по-голяма от посочената стойност. Следното изявление ще извлече документите, където OrderTotal е по-голямо от 800.

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

Подобен SQL израз би бил както следва

SELECT * FROM orders WHERE OrderTotal>800.00

Пример

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

3. $gte оператор

Можете да използвате оператора $gte, за да извлечете документите, където стойността на полето е по-голяма или равна на посочената стойност. Следното изявление ще извлече документите, където OrderTotal е по-голямо или равно на 800.

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

Подобен SQL израз би бил както следва

SELECT * FROM orders WHERE OrderTotal>=800.00

Пример

>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 оператор

Можете да използвате оператора $lt, за да извлечете документите, където стойността на полето е по-малка от посочената стойност. Следното изявление ще извлече документите, където OrderTotal е по-малко от 800.

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

Подобен SQL израз би бил както следва

SELECT * FROM orders WHERE OrderTotal<800.00

Пример

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

4. $lte оператор

Можете да използвате оператора $lte, за да извлечете документите, където стойността на полето е по-малка или равна на посочената стойност. Следното изявление ще извлече документите, където OrderTotal е по-малко или равно на 800.

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

Подобен SQL израз би бил както следва

SELECT * FROM orders WHERE OrderTotal<=800.00

Пример

>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 оператор

Можете да използвате оператора $ne, за да извлечете документите, където стойността на полето не е равна на посочената стойност.

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

Подобен SQL израз би бил както следва

SELECT * FROM orders WHERE PaymentMode != "Card"

Пример

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

6. $in оператор

Можете да използвате оператора $in, за да извлечете документите, където стойността на полето е равна на която и да е стойност в посочения масив.

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

Пример

>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 оператор

Можете да използвате оператора $nin, за да извлечете документи, където стойността на полето не е равна на никоя стойност в посочения масив. Той също така ще избере документите, където полето не съществува.

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

Пример

>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}
		]
	}
>

Индексиране

Знаем, че индексирането е много важно, ако изпълняваме заявките в голяма база данни. Без индексиране изпълнението на заявка може да бъде скъпо. Можем да добавим прост възходящ индекс към едно поле, като използваме следния израз.

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

MongoDB създава уникален индекс в полето „_id“ по подразбиране. Уникален индекс ще предотврати вмъкването на два документа със същата стойност за това поле. Ако искате да създадете уникален индекс, тогава изявлението ще бъде както следва.

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

Заключение

Надявам се, че сте научили нещо ново днес. Ако искате да научите още няколко неща за MongoDB, ето една интересна статия за Self-Hosted MongoDB. Също така ви каня да опитате неща сами и да споделите опита си в секцията за коментари. Освен това, ако се сблъскате с някакви проблеми с някое от горните дефиниции, моля, не се колебайте да ме попитате в коментарите по-долу.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Кога трябва да използвам NoSQL база данни вместо релационна база данни? Добре ли е да използвате и двете на един и същи сайт?

  2. Намерете общото време, прекарано от потребител в mongoDB

  3. Mongodb $lookup Не работи с _id

  4. Деинсталирайте mongoDB от ubuntu

  5. Зареждането на частични части е неуспешно на сървъра JS