Category Archives: 10gen: M102 MongoDB for DBAs

Конспект лекций M102 MongoDB for DBAs (Week 1)

О данном курсе 10gen: M102 MongoDB for DBAs

M102: MongoDB for DBAs Dwight Merriman, Co-Founder and CEO, 10gen
Learn what it takes to administer a MongoDB installation in production. This course begins by assuming you have no experience with MongoDB, taking you through the basics on installations. You will learn about JSON and MongoDB’s extensive query capabilities through the Mongo shell. We will cover importing and exporting data into and backing up MongoDB. After that it is on to scaling up with Mongo, including indexing, performance turning and monitoring, and sharding. Finally, we cover replication and fault tolerance. No prior experience with MongoDB is assumed for this course but a knowledge of administration topics regarding any other database will be helpful.

JSON (JavaScript Object Notation) – Tекстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.
BSON (Binary JavaScript Object Notation) – Это бинарная форма представления простых структур данных и ассоциативных массивов . Имя «BSON» основано на определении JSON и неофициально значит «Binary JSON»

Типы Данных JSON
Объект — это неупорядоченное множество пар имя/значение, заключённое в фигурные скобки { }. Между именем и значением стоит символ “: “, а пары имя/значение разделяются запятыми.
Массив (одномерный) — это множество значений, имеющих порядковые номера (индексы). Массив заключается в квадратные скобки [ ]. Значения отделяются запятыми.
Значение может быть строкой в двойных кавычках, числом, значением true или false, объектом, массивом, или значением null.
Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки, с использованием escape-последовательностей начинающихся с обратной косой черты.
Имя — это строка.

Примеры
Number age” : 25
String “name” : “John”
Boolean “Voted” : “True”
Array “phones” : [ {“phone”:”212-555-1234″, “type” : “home”}, {“phone”:”646-555-1234″, “type” : “mobile”} ]
Object {“phone”:”212-555-1234″, “type” : “home”}
Null “name” : null

Установка MongoDB 2.2 на CentOS 6.3 x64

# cat /etc/issue
CentOS release 6.3 (Final)
# uname -p
x86_64

Скачиваем и устанавливаем rpm

# rpm -ivh http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/RPMS/mongo-10gen-2.2.0-mongodb_1.x86_64.rpm
# rpm -ivh http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/RPMS/mongo-10gen-server-2.2.0-mongodb_1.x86_64.rpm

Устанавливаем в автозагрузку и запускаем

# chkconfig mongod on
# chkconfig --list | grep mongod
mongod          0:off   1:off   2:on    3:on    4:on    5:on    6:off
# service mongod start
Starting mongod: all output going to: /var/log/mongo/mongod.log
forked process: 62844
child process started successfully, parent exiting     [  OK  ]

Проверяем

# mongod --version
db version v2.2.0, pdfile version 4.5

Импортируем products.json

# mongoimport --help
Import CSV, TSV or JSON data into MongoDB.
# mongoimport --db pcat --collection products < /root/products.3eb7cd1a9633.json
connected to: 127.0.0.1
Sun Oct 28 09:44:25 imported 11 objects

Подключение к базе данных

# mongo
MongoDB shell version: 2.2.0
connecting to: test
> db
test
> use pcat
switched to db pcat
> db
pcat
> exit
bye

Или

# mongo pcat
MongoDB shell version: 2.2.0
connecting to: pcat
> db
pcat
> exit
bye

Какие базы данных есть на сервере

# mongo
MongoDB shell version: 2.2.0
connecting to: test
> show dbs
local   (empty)
pcat    0.203125GB

Посмотреть collections в текущей базе данных

> use pcat
switched to db pcat
> show collections
products
system.indexes

MongoDB Shell
db.products.findOne()

{
        "_id" : "ac3",
        "name" : "AC3 Phone",
        "brand" : "ACME",
        "type" : "phone",
        "price" : 200,
        "warranty_years" : 1,
        "available" : true
}

db.products.find().limit()2
{ "_id" : "ac3", "name" : "AC3 Phone", "brand" : "ACME", "type" : "phone", "price" : 200, "warranty_years" : 1, "available" : true }
{ "_id" : "ac7", "name" : "AC7 Phone", "brand" : "ACME", "type" : "phone", "price" : 320, "warranty_years" : 1, "available" : false }

Поиск
> db.products.find({price : 12.5})
{ "_id" : ObjectId("507d95d5719dbef170f15bfc"), "name" : "AC3 Case Black", "type" : [ "accessory", "case" ], "color" : "black", "price" : 12.5, "warranty_years" : 0.25, "available" : false, "for" : "ac3" }

В более читаемом виде
>db.products.find({price : 12.5}).toArray()

[
        {
                "_id" : ObjectId("507d95d5719dbef170f15bfc"),
                "name" : "AC3 Case Black",
                "type" : [
                        "accessory",
                        "case"
                ],
                "color" : "black",
                "price" : 12.5,
                "warranty_years" : 0.25,
                "available" : false,
                "for" : "ac3"
        }
]

>db.products.findOne( { "_id" : ObjectId("507d95d5719dbef170f15bfd") } )

{
        "_id" : ObjectId("507d95d5719dbef170f15bfd"),
        "name" : "AC3 Case Red",
        "type" : [
                "accessory",
                "case"
        ],
        "color" : "red",
        "price" : 12,
        "warranty_years" : 0.25,
        "available" : true,
        "for" : "ac3"
}
> db.products.count()
11
>db.products.find({type: "case", for: "ac3"}).toArray()
[
        {
                "_id" : ObjectId("507d95d5719dbef170f15bfc"),
                "name" : "AC3 Case Black",
                "type" : [
                        "accessory",
                        "case"
                ],
                "color" : "black",
                "price" : 12.5,
                "warranty_years" : 0.25,
                "available" : false,
                "for" : "ac3"
        },
        {
                "_id" : ObjectId("507d95d5719dbef170f15bfd"),
                "name" : "AC3 Case Red",
                "type" : [
                        "accessory",
                        "case"
                ],
                "color" : "red",
                "price" : 12,
                "warranty_years" : 0.25,
                "available" : true,
                "for" : "ac3"
        }
]

До сортировки по цене

> db.products.find( {}, {name:1, price:1, _id:0})
{ "name" : "AC3 Phone", "price" : 200 }
{ "name" : "AC7 Phone", "price" : 320 }
{ "name" : "AC3 Series Charger", "price" : 19 }
{ "name" : "AC3 Case Green", "price" : 12 }
{ "name" : "Phone Extended Warranty", "price" : 38 }
{ "name" : "AC3 Case Black", "price" : 12.5 }
{ "name" : "AC3 Case Red", "price" : 12 }
{ "name" : "Phone Service Basic Plan" }
{ "name" : "Phone Service Core Plan" }
{ "name" : "Phone Service Family Plan" }
{ "name" : "Cable TV Basic Service Package" }

После сортировке по цене в порядке возрастания

db.products.find( {}, {name:1, price:1, _id:0}).sort({price:1})
{ "name" : "Phone Service Basic Plan" }
{ "name" : "Phone Service Core Plan" }
{ "name" : "Phone Service Family Plan" }
{ "name" : "Cable TV Basic Service Package" }
{ "name" : "AC3 Case Green", "price" : 12 }
{ "name" : "AC3 Case Red", "price" : 12 }
{ "name" : "AC3 Case Black", "price" : 12.5 }
{ "name" : "AC3 Series Charger", "price" : 19 }
{ "name" : "Phone Extended Warranty", "price" : 38 }
{ "name" : "AC3 Phone", "price" : 200 }
{ "name" : "AC7 Phone", "price" : 320 }

После сортировке по цене в порядке убывания

> db.products.find( {}, {name:1, price:1, _id:0}).sort({price:-1})
{ "name" : "AC7 Phone", "price" : 320 }
{ "name" : "AC3 Phone", "price" : 200 }
{ "name" : "Phone Extended Warranty", "price" : 38 }
{ "name" : "AC3 Series Charger", "price" : 19 }
{ "name" : "AC3 Case Black", "price" : 12.5 }
{ "name" : "AC3 Case Green", "price" : 12 }
{ "name" : "AC3 Case Red", "price" : 12 }
{ "name" : "Phone Service Basic Plan" }
{ "name" : "Phone Service Core Plan" }
{ "name" : "Phone Service Family Plan" }
{ "name" : "Cable TV Basic Service Package" }