Статьи

MongoDB для людей MySQL — часть 2


Во второй части серии блогов по использованию базы данных NoSQL, в данном случае MongoDB, предназначенной для пользователей MySQL, я немного опишу запросы.
И это, вероятно, не то, что вы ожидали, если вы раньше не пробовали базу данных NoSQL или MongoDB более конкретно. Первый пост на эту тему находится
здесь .

В основе доступа к MongoDB лежит JavaScript, более конкретно он использует
Mozilla
SpiderMonkeyДвижок JavaScript. Как я писал в предыдущем блоге на эту тему, JavScript повсеместно используется в MongoB, в основном вы можете рассматривать MonngoDB как JavaScript с огромным пространством для переменных, и хотя многие считают это грубым упрощением, он работает как простое описание о том, что мы имеем здесь. JavaScript для запросов, вставки, администрирования, создания сценариев и «хранимых процедур» (они не называются так в MongoDB, но вы понимаете, что я имею в виду). И
JSON (нотация объектов JavaScript) для данных, при вставке объекта вы создаете объект JSON, когда вы запрашиваете, то, что вы возвращаете, является объектом JSON. и т. д. Внутри Mongo использует двоичное представление JSON, которое называется BSON.

Так что у нас много JavaScript и JSON, и если вы не фанат JavaScript, то, вероятно, MongoDB не для вас! В базе данных MongoDB есть коллекции, которые похожи на таблицы, но в коллекции нет, как в СУБД, группы строк с одинаковыми столбцами (атрибутами), вместо этого есть несколько объектов, все используют один и тот же «первичный ключ» (называемый
_id ), а сам объект является объектом JSON с любыми атрибутами. Вот почему MongoDB «без схемы», нет заданной схемы для объектов (т.е. «строк»), кроме
_id then.

Схема без схемы иногда дает выражениеh, что кроме уникального ключа доступа, нет другого способа доступа к данным и что у вас не может быть вторичных индексов, но вы точно можете! Но сейчас я забегаю вперед.

Давайте попробуем MongoDB. После установки MongoDB (что очень просто) и запуска сервера, получите доступ к командной строке с помощью программы командной строки «mongo». В примерах, которые я здесь показываю, я использую настройку с разделением на сегменты, поэтому приглашение будет «mongos», и оно может отличаться в зависимости от вашей конфигурации и версии MongoDB. Во-первых, давайте создадим базу данных для игры;

mongos> use mytest



Эй , спросите вы, что здесь происходит? Вы никогда не создавали базу данных, вы просто получили к ней доступ? Да, это соглашение с MongoDB, вы просто получаете доступ к базе данных или коллекции, и если она еще не существует, она создается для вас. По этой причине многие базы данных MongoDB, даже в рабочей среде, содержат множество неправильно написанных имен баз данных и коллекций.

Теперь давайте посмотрим, какая база данных, к которой мы обращаемся, действительно существует.

mongos> show dbs
admin (empty)
config 0.1875GB
test (empty)

и, как вы видите, я солгал вам, моей самой
лучшей базы данных нет вообще! Ну, причина в том, что там еще нет коллекции, поэтому давайте создадим ее:

mongos> db.foo.insert({attr1: 1})

Снова я обращаюсь к чему-то, что не существует, чтобы создать его, в данном случае это коллекция с именем
foo , где первый объект имеет один атрибут attr1 со значением 1. Теперь самая
лучшая база данных должна существовать, так как данные в это, давайте посмотрим:

mongos> show dbs
admin (empty)
config 0.1875GB
mytest 0.203125GB

И все, база данных mystest создана и коллекция
foo :

mongos> show collections
foo
system.indexes

Хорошо, вот, база данных и коллекция для вас. Это становится все жарче! Давайте вставим еще немного данных:

mongos> db.foo.insert({attr1: 2})
mongos> db.foo.insert({attr2: 3})
mongos> db.foo.insert({attr2: 4, attr3: 5})

Все это действительные данные, каждый объект может иметь разное и различное количество атрибутов, фактически каждый объект может иметь любой атрибут, который вы захотите. Что не обязательно делает это хорошей идеей, но хорошо иметь это чувство полной свободы, верно?

Еще несколько вставок:

mongos> db.foo.insert({attr2: 4, attr4: {attr5: 6, attr6: 7}})
mongos> db.foo.insert({attr2: 4, attr7: [10, 11, 12]})

Здесь я сначала вставляю объект, где один атрибут сам по себе является объектом, а затем объект, где один атрибут является массивом. Эй, круто!

Теперь, давайте сделаем что-нибудь. Сначала просто получите данные:

mongos> db.foo.find()
{ "_id" : ObjectId("4ea528fb35a81331e048baa9"), "attr1" : 1 }
{ "_id" : ObjectId("4ea52a4835a81331e048baaa"), "attr1" : 2 }
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }
{ "_id" : ObjectId("4ea52a5f35a81331e048baac"), "attr2" : 4, "attr3" : 5 }
{ "_id" : ObjectId("4ea52ae635a81331e048baad"), "attr2" : 4, "attr4" : { "attr5" : 6, "attr6" : 7 } }
{ "_id" : ObjectId("4ea52afc35a81331e048baae"), "attr2" : 4, "attr7" : [ 10, 11, 12 ] }

Функция
find ()
— это встроенная функция MongoDB, которая повторяет данные для вас и может принимать 2 необязательных аргумента, каждый из которых является объектом сам по себе (удивительно!):

  1. Запрос-спецификация.
  2. Колумбы вернуться.

Например:

mongos> db.foo.find({ attr2: 3})
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }

Здесь я запрашиваю все объекты, где c1 равен 3. Атрибут attr2 не имеет индекса, но я могу запросить его. Чтобы использовать принудительный
ключ
_id , просто сделайте это (в вашем случае вы, конечно, увидите другой идентификатор объекта):

mongos> db.foo.find({ _id: ObjectId("4ea52a5035a81331e048baab")})
{ "_id" : ObjectId("4ea52a5035a81331e048baab"), "attr2" : 3 }

Прежде чем я закрою сейчас, позвольте мне показать вам, как вы можете сказать, что последний из двух последних запросов был более эффективен при использовании
объяснения () (вы этого не ожидали, не так ли):

mongos> db.foo.find({ attr2: 3}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 6,
"nscannedObjects" : 6,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {

}
}

Результатом объяснения является, как и следовало ожидать, объект JavaScript. Посмотрите на
атрибут
nscanned здесь. У атрибута attr2 нет индекса, поэтому все объекты проверяются по сравнению с этим:

mongos> db.foo.find({ _id: ObjectId("4ea52a5035a81331e048baab")}).explain()
{
"cursor" : "BtreeCursor _id_",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 22,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"_id" : [
[
ObjectId("4ea52a5035a81331e048baab"),
ObjectId("4ea52a5035a81331e048baab")
]
]
}
}

Здесь только один объект просматривается для получения данных, а столбец id используется для их поиска (смотрите в
атрибуте indexBounds ). Пока что запросы не так сложны, как в РСУБД, кроме всех этих объектов и JavaScript.

Вот и все, я скоро вернусь с еще несколькими уроками MongoDB! Следующий пост будет посвящен более сложным запросам!

/ Карлссон

Источник: 
http://karlssonondatabases.blogspot.com/2011/10/mongodb-for-mysql-folks-part-2.html