Отворени вебинар "Основе МонгоДБ"

Пријатељи, почетак новог курса "База података" одржаће се сутра, па смо одржали традиционални отворени час чији снимак можете погледати овде. Овог пута смо причали о популарној бази података МонгоДБ: проучили смо неке од суптилности, погледали основе рада, могућности и архитектуре. Такође смо се дотакли неких случајева корисника.

Отворени вебинар "Основе МонгоДБ"

Одржан је вебинар Иван Белт, шеф развоја сервера у Цитимобилу.

МонгоДБ карактеристике

МонгоДБ је ДБМС отвореног кода оријентисан на документе који не захтева опис шеме табеле. Класификован је као НоСКЛ и користи БСОН (бинарни ЈСОН). Скалабилан из кутије, написан у Ц++ и подржава ЈаваСцрипт синтаксу. Не постоји СКЛ подршка.

МонгоДБ има драјвере за многе популарне програмске језике (Ц, Ц++, Ц#, Го, Јава, ЈаваСцрипт, Перл, ПХП, Питхон, Руби, итд.). Постоје и незванични драјвери за друге програмске језике које подржава заједница.

Па, хајде да погледамо основне команде које могу бити корисне.

Дакле, да примените МонгоДБ у Доцкер-у, пишемо:

docker run -it --rm -p 127.0.0.1:27017:27017 
--name mongo-exp-project mongo
docker exec -it mongo-exp-project mongo

Тако се дешава покретање клијента МонгоДБ:

Отворени вебинар "Основе МонгоДБ"

Хајде сада да напишемо традиционални Хелло Ворлд:

print (“Hello world!”)

Отворени вебинар "Основе МонгоДБ"

Након тога - хајде да започнемо циклус:

Отворени вебинар "Основе МонгоДБ"

Као што сте приметили, пре нас редовни ЈС, а МонгоДБ је пуноправни ЈаваСцрипт тумач.

Када користити МонгоДБ?

Постоји прича да је просечан стартап у Силицијумској долини особа која је пре недељу дана отворила књигу „ХТМЛ за лутке“. Који ће стек изабрати? Слажете се да је за њега веома згодно када, из очигледних разлога, има ЈаваСцрипт у свом претраживачу, Ноде.јс ради на серверу, а ЈаваСцрипт такође ради у бази података. Ово је тачка број 1.

Друго, постоји одличне перформансе Петер Зајцев, један од најбољих стручњака за базе података у Русији. У њему Питер говори о МиСКЛ-у и МонгоДБ-у, обраћајући посебну пажњу на то када и шта је најбоље користити.

Треће, желео бих да нагласим да МонгоДБ карактерише добро прилагодљивост - а ово је једна од кључних карактеристика базе података. Ако не знате унапред какво ће бити оптерећење, МонгоДБ је савршен. Поред тога, подржава готове шаблоне као што су схадинг и репликација, и све ово је урађено прилично транспарентно, односно веома је згодно за рад.

Што се тиче терминологија у МонгоДБ онда:

  • базе података су базе података (шеме, збирке табела);
  • у МонгоДБ постоји нешто као колекцију - ово је аналог табеле и скуп докумената који, логично, треба да буду повезани;
  • документи су аналогни стрингу.

Креирање базе података и једноставни упити

Да бисте креирали базу података, само треба да почнете да је користите:

use learn

Отворени вебинар "Основе МонгоДБ"

Сада направимо мали уметак документа. Нека то буде, на пример, једнорог по имену Аурора:

db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})

db - глобални објекат за приступ бази података, односно, у ствари, сама „монга“. Користи се за шардинг sh, за репликацију - rs.

Које команде има објекат? db:

Отворени вебинар "Основе МонгоДБ"

Дакле, вратимо се на нашу команду, због чега ће конзола извести да је један ред уметнут:

Отворени вебинар "Основе МонгоДБ"

Ворд unicorns у тиму db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) означава колекцију. Имајте на уму да нисмо описали или креирали колекцију, већ смо једноставно написали „једнорозе“, урадили уметак и имали смо колекцију.

И овако можемо набавите све наше колекције:

db.getCollectionNames()

И тако даље. Моћи убаци још једну колекција:

Отворени вебинар "Основе МонгоДБ"

Сада да питамо комплетна збирка (подсећамо вас да у нашем случају база података већ садржи информације о два једнорога са истим именом):

db.unicorns.find()

Имајте на уму, овде је наш ЈСОН (постоји име, пол, тежина, неки јединствени идентификатор објекта):

Отворени вебинар "Основе МонгоДБ"

Сада убацимо још пар једнорога са истим именима:

db.unicorns.insert({name: 'Leto', gender: 'm', 
home: 'Arrakeen', worm: false}) 
db.unicorns.insert({name: 'Leto', gender: 'm', 
home: 'Arrakeen', worm: false})

И да видимо шта се десило:

Отворени вебинар "Основе МонгоДБ"

Као што видите, имамо додатна поља: дом и црв, коју Аурора нема.

Хајде да додамо још неколико једнорога:

db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, 
{name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, 
{name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, 
{name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}])

Дакле, убацили смо још четири објекта користећи ЈаваСцрипт:

Отворени вебинар "Основе МонгоДБ"

По вашем мишљењу, у којим базама података је погодније чувати податке о пасошу: релационе базе података или Монго?

Одговор је очигледан - у Монги, а горњи пример то добро показује. Није тајна да је КЛАДР мука у Руској Федерацији. И Монга се одлично уклапа са адресама, јер све можете поставити као низ и живот ће бити много лакши. И то је добро Кориснички случај за МонгоДБ.

Хајде да додамо још једнорога:

db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); 
db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); 
db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); 
db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); 
db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); 
db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); 
db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); 
db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165});

Отворени вебинар "Основе МонгоДБ"

Сада обратите пажњу на документе. Као доб Чувамо читаве предмете. Постоје и информације о томе шта једнорог воли, а не сви имају ове информације. Дакле унутра лажи пуни низ.

Иначе, да бисте лепше приказали резултате, можете позвати метод на крају команде за претрагу .pretty():

Отворени вебинар "Основе МонгоДБ"

Ако треба да добијете информације о последњој грешци, користите следећу команду:

db.getLastError()

Ово се може урадити након сваког уметања, или можете конфигурисати Врите Цонцерн. Боље је прочитати о томе у званична документација, који је, иначе, веома информативан у Монги. Иначе, доступан је и на Хабре добар чланак у овој прилици.

Пређимо на сложеније упите

Упит за тачну вредност поља:

db.unicorns.find({gender: 'm'})

Писањем таквог захтева добићемо листу свих мушких једнорога у излазу конзоле.

Такође можете упит на неколико поља одједном: по полу и по тежини:

Отворени вебинар "Основе МонгоДБ"

Изнад, обратите пажњу на посебно $гт селектор, што вам омогућава да узгајате све мушке једнороге тежине више од 700.

Можете проверити да ли поље уопште постоји?:

db.unicorns.find({vampires: {$exists: false}})

Или тако:

db.unicorns.find({'parents.father': {$exists: true}})

Следећи тим ће извести једнороге, чија имена почињу словима А или а:

db.unicorns.find({name: {$regex: "^[Aa]"}})

Сада размотримо претрага низа. Питање #1: Шта ће ова команда дати:

db.unicorns.find({loves:'apple'})

Тако је: сви који воле јабуке.

Следећа команда ће вратити само оне податке о једнорогу који садрже само јабуке и лубенице:

db.unicorns.find({loves:[ "apple", "watermelon" ]})

И још једна команда:

db.unicorns.find({loves:[ "watermelon", "apple" ]})

У нашем случају, неће вратити ништа, јер када проследимо низ, први елемент се пореди са првим, други са другим, итд. То јест, низ такође мора да се подудара по позицијама ове вредности.

А овако изгледа претражујући низ помоћу оператора „ИЛИ“.:

Отворени вебинар "Основе МонгоДБ"

Следећи пример ће нам показати претражите помоћу оператора $алл. А овде је редослед небитан:

Отворени вебинар "Основе МонгоДБ"

Такође можемо тражи по величини низа:

Отворени вебинар "Основе МонгоДБ"

Али шта ако желимо да пронађемо низ чија је величина већа од јединице? За ово постоји оператер $где, помоћу којих можете писати сложеније ствари:

db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } })

Успут, ако желите да вежбате, ту си фајл са командама.

Функције курсора

Хајде да мало одступимо и кажемо неколико речи о карактеристикама Монга:

  • финд() и друге операције не враћају податке - оне враћају такозвани „курсор“;
  • чињеница да видимо да се подаци штампају дело је тумача.

куцање дб.уницорнс.финд без заграда, добијамо промпт:

Отворени вебинар "Основе МонгоДБ"

Настављамо да испуњавамо захтеве

Ту је и оператор $ин:

db.unicorns.find({weight: {$in: [650, 704]}})

Отворени вебинар "Основе МонгоДБ"

Хајде сада да причамо о ажурирању. На пример, променимо тежину једнорога Рооооодлес:

db.unicorns.update({name: "Roooooodles"}, {weight: 2222})

Као резултат наших акција, документ биће потпуно ажурирана, и само једно наведено поље ће остати у њему:

Отворени вебинар "Основе МонгоДБ"

Односно, једино што ће остати за наш објекат је тежина 2222 и, наравно, ид.

Можете исправити ситуацију користећи $сет:

db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}})

Отворени вебинар "Основе МонгоДБ"

Такође је могуће вредности прираштаја:

Отворени вебинар "Основе МонгоДБ"

И постоји упсерт - комбинација ажурирања и уметања:

Отворени вебинар "Основе МонгоДБ"

Ево како се то ради избор поља:

Отворени вебинар "Основе МонгоДБ"

Отворени вебинар "Основе МонгоДБ"

Остаје додати неколико речи о прескочити и ограничити:

Отворени вебинар "Основе МонгоДБ"

Колеге, то је све, ако желите да знате детаље, погледајте цео видео. И не заборавите да оставите своје коментаре!

Извор: ввв.хабр.цом

Додај коментар