Увеличете уменията си с практикуване

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

Няколко NoSQL бази данни съществуват в екосистемата за наука за данни. Един от популярните е MongoDB, който съхранява данни като документи.

Документ в MongoDB се състои от двойки поле-стойност. Документите са организирани в структура, наречена „колекция“. Като аналогия, можем да мислим за документите като редове в таблица, а колекциите като таблици.

В тази статия ще разгледаме няколко примера, за да практикуваме заявки към база данни в MongoDB. Ако искате да прочетете повече за NoSQL и как да настроите MongoDB във вашия компютър, ето уводно ръководство, към което можете да се обърнете.

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

{
 "_id" : ObjectId("6014dc988c628fa57a508088"),
 "Age" : "Middle",
 "Gender" : "Male",
 "OwnHome" : "Rent",
 "Married" : "Single",
 "Location" : "Close",
 "Salary" : 63600,
 "Children" : 0,
 "History" : "High",
 "Catalogs" : 6,
 "AmountSpent" : 1318
}

Пример 1

Методът find извлича всички документи по подразбиране. Можем да използваме метода за ограничаване, за да покажем само определен брой документи. Например, можем да покажем първия документ в колекцията, както следва:

> db.marketing.find().limit(1).pretty()
{
 "_id" : ObjectId("6014dc988c628fa57a508088"),
 "Age" : "Middle",
 "Gender" : "Male",
 "OwnHome" : "Rent",
 "Married" : "Single",
 "Location" : "Close",
 "Salary" : 63600,
 "Children" : 0,
 "History" : "High",
 "Catalogs" : 6,
 "AmountSpent" : 1318
}

Db се отнася до текущата база данни. Трябва да посочим името на колекцията след точката. Красивият метод е да показвате документите по по-структуриран начин. Без красивия метод изходът изглежда така:

{ "_id" : ObjectId("6014dc988c628fa57a508088"), "Age" : "Middle", "Gender" : "Male", "OwnHome" : "Rent", "Married" : "Single", "Location" : "Close", "Salary" : 63600, "Children" : 0, "History" : "High", "Catalogs" : 6, "AmountSpent" : 1318 }

Пример 2

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

> db.marketing.find( {"Children": 1} ).limit(1).pretty()
{
 "_id" : ObjectId("6014dc988c628fa57a50808a"),
 "Age" : "Middle",
 "Gender" : "Male",
 "OwnHome" : "Own",
 "Married" : "Married",
 "Location" : "Close",
 "Salary" : 85600,
 "Children" : 1,
 "History" : "High",
 "Catalogs" : 18,
 "AmountSpent" : 2436
}

Това обаче не е най-добрият начин за филтриране. Конвейерът за агрегиране на MongoDB предоставя много по-ефективен начин за филтриране, трансформиране и агрегиране на данни, както ще видим в следващите примери.

Пример 3

Искаме да разберем средната изразходвана сума от клиенти, получили повече от 10 каталога. Агрегираният тръбопровод може да се използва за изпълнение на тази задача, както следва.

> db.marketing.aggregate([
... { $match : { Catalogs : {$gt : 10} } },
... { $group : { _id : null, avgSpent : {$avg : "$AmountSpent"} } }
... ])
{ "_id" : null, "avgSpent" : 1418.9411764705883 }

Първата стъпка от конвейера е етапът на съответствие, който филтрира документите според даденото условие. Изразът „$gt“ означава „по-голямо от“. Груповият етап извършва агрегацията въз основа на дадените полета и функцията за агрегиране.

Пример 4

В предишния пример намерихме средната изразходвана сума от клиенти, които са получили повече от 10 каталога. Нека да направим една крачка напред и да намерим същата стойност за различните възрастови групи поотделно.

> db.marketing.aggregate([
... { $match : { Catalogs : {$gt : 10} } },
... { $group : { _id : "$Age", avgSpent : {$avg : "$AmountSpent"} } }
... ])
{ "_id" : "Middle", "avgSpent" : 1678.3965087281795 }
{ "_id" : "Old", "avgSpent" : 1666.9056603773586 }
{ "_id" : "Young", "avgSpent" : 655.813829787234 }

Единствената промяна е в стойността „_id“. Той определя полето, което да се използва като поле за групиране.

Пример 5

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

> db.marketing.aggregate([
... { $match : { Children : {$gt : 0} } },
... { $group: { 
...             _id : null,
...             "avgSalary" : {$avg: "$Salary"},
...             "totalSpent" : {$sum: "$AmountSpent"}
...           } 
... }
... ])
{ "_id" : null, "avgSalary" : 57140.89219330855, "totalSpent" : 566902 }

Всяка агрегация се записва като отделен запис в груповата фаза.

Пример 6

Агрегираният конвейер на MongoDB има етап за сортиране на резултатите от заявката. Полезно е, когато резултатите се състоят от няколко записа. Освен това сортираният набор от данни осигурява по-структуриран преглед.

Следната заявка връща средната заплата на клиенти, които са похарчили повече от 1000 долара. Резултатите са групирани по брой деца и сортирани по средна работна заплата в низходящ ред.

> db.marketing.aggregate([
... { $match: { AmountSpent : {$gt : 1000}}},
... { $group: { _id : "$Children", avgSalary : {$avg : "$Salary"}}},
... { $sort: { avgSalary : -1 }}
... ])
{ "_id" : 3, "avgSalary" : 84279.48717948717 }
{ "_id" : 2, "avgSalary" : 83111.11111111111 }
{ "_id" : 1, "avgSalary" : 78855.97014925373 }
{ "_id" : 0, "avgSalary" : 71900.76045627377 }

В етапа на сортиране „-1“ показва низходящ ред, а „1“ показва възходящ ред.

Пример 7

В тези примери ще видим два нови етапа от тръбопровода за агрегиране.

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

В етапа на проекта избираме полетата, които да се показват със стойност 1. Резултатът показва само посочените полета. Важно е да се отбележи, че полето id се показва по подразбиране във всички случаи. Трябва изрично да го зададем като 0, за да изключим полето id от резултата.

Ограничителният етап в тръбопровода за агрегиране поставя ограничение върху броя на документите, които трябва да бъдат показани. Това е същото като ключовата дума limit в SQL.

Следващата заявка филтрира документите въз основа на изразходваната сума и след това сортира по заплата. Той показва само полетата за заплата и изразходвана сума на първите 5 документа.

> db.marketing.aggregate([
... { $match : { AmountSpent : {$gt : 1500} } },
... { $sort : { Salary : -1 } },
... { $project : { _id : 0, Salary : 1, AmountSpent : 1 } },
... { $limit : 5 }
... ])
{ "Salary" : 168800, "AmountSpent" : 1512 }
{ "Salary" : 140000, "AmountSpent" : 4894 }
{ "Salary" : 135700, "AmountSpent" : 2746 }
{ "Salary" : 134500, "AmountSpent" : 4558 }
{ "Salary" : 131500, "AmountSpent" : 2840 }

Заключение

Покрихме няколко примера, които демонстрират как да правите заявки към MongoDB база данни. Конвейерът за агрегиране позволява създаване на прости, както и много сложни заявки.

Видяхме 5 основни етапа в тръбопровода за агрегиране, които са съпоставяне, групиране, сортиране, проект и ограничаване. Има много повече етапи, които правят операцията за заявка гъвкава и мощна.

Както при всеки друг предмет, изисква много практика, за да бъдете удобни при писането на заявки в MongoDB.

Благодаря ви, че прочетохте. Моля, уведомете ме, ако имате отзиви.