{{tag>Server mongo nosql}}

====== MongoDb ======

===== Документация =====

  * http://mongoid.org/en/mongoid/docs/querying.html (ruby)
  * http://jsman.ru/mongo-book/

===== Видео =====

  * https://www.youtube.com/channel/UCLYMAj4tAAh5iVDNHXpDm3Q/videos

===== Установка =====

<code bash>
$ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
$ echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
$ apt-get update
$ apt-get install -y mongodb-org
</code>

===== Настройка =====

==== Добавление внешнего IP адреса ====

=== Version 2.x ===

nano /etc/mongod.conf
<code>
port: 27017
bind_ip: 127.0.0.1,89.2.1.1
</code>

Подробнее: https://docs.mongodb.org/v2.2/reference/configuration-options/

=== Version 3.x ===

nano /etc/mongod.conf
<code>
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,89.2.1.1
</code>

Подробнее: https://docs.mongodb.org/v3.2/reference/configuration-options/

===== PHP =====

  * sudo pecl install mongo

===== Создание пользователя =====

<code bash>
$ mongo
MongoDB shell version: 2.4.9
connecting to: test
> use admin;
switched to db admin
</code>

==== 2.4 ====

  * > **use admin;**
  * > db.removeUser('admin');
  * > **db.addUser({user:'admin', pwd:'pass', roles: ['dbAdminAnyDatabase']});**
  * > db.auth('admin','pass');

=== Roles ===

  * read
  * readWrite
  * dbAdmin
  * dbOwner 
  * userAdmin
  * clusterAdmin
  * clusterManager
  * clusterMonitor
  * hostManager
  * readAnyDatabase 
  * readWriteAnyDatabase
  * userAdminAnyDatabase
  * dbAdminAnyDatabase

http://docs.mongodb.org/manual/reference/built-in-roles/
==== 2.6.4 ====

  * > use some_database
  * > db.getSiblingDB("admin").runCommand({authSchemaUpgrade: 1 });
  * > db.dropUser('admin');
  * > db.createUser({ user:"user", pwd:"password", roles:["read","readWrite","dbAdmin"]});
  * > db.auth('admin','pass');

==== 3.0.0 ====

  * > use admin;
  * > db.dropUser('admin')

==== 3.2.3 ====

===== Изменение пользователя =====

  * db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

===== Привелегии =====

  * <code>
db.runCommand(
  {
    usersInfo:"admin",
    showPrivileges:true
  }
);
</code>

===== Backup / Restore =====

==== Backup ====

Если не задан пароль у юзера admin в БД admin
  mongodump --out /tmp/mongodump

Если задан пароль у юзера
  mongodump --username admin --password password --out /tmp/mongodump
  
Если дамп выполняется с учетом пользовательских настроек
  mongodump --host localhost --port 3017 --username admin --password pass --out /tmp/mongodump

==== Restore ====

  mongorestore --db some_other_db -c some_or_other_collection tmp/mongodump/some_collection.bson

  mongorestore --db some_other_db --username user --password pass ./

===== SEARCH =====

  * db.getCollection('rooms').find({roomid: 'user-53'})
  * db.users.find({"name": /.*Супр.*/})

===== INSERT =====

===== UPDATE ($where, $params) =====

  * db.unicorns.update({name: 'Roooooodles'}, {weight: 590})
  * db.unicorns.update({weight: 590}, {$set: {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], gender: 'm', vampires: 99}})
  * db.getCollection('rooms').update({},{messageCount: 0})
  * db.getCollection('rooms').update({},{$set: {'messageCount': 0}}, {multi: true});
  * <code php>
db.getCollection('rooms').update(
   {},
   { $set: {'messageCount': 0}},
   { upsert: true, multi: true }
);
   
db.getCollection('rooms').find({});
</code>

===== geoNear =====

==== MongoDB: geoNear не возвращаясь расстояние ====

 Мне нужно, чтобы изменить существующий геопространственных запросов таким образом, что она включает в себя расстояние в результаты поиска. (Оба документа и существующий запрос с использованием устаревших координатных пар.) Исходный запрос использует $near. Чтение документации MongoDB похоже, geoNear должен возвратить расстояние, как показано на нескольких примерах.

В то время как я был в состоянии изменить запрос, чтобы использовать geoNear, расстояния не включены в результаты поиска. Вот пример нового запроса:

  { 
    geoNear: 'users',
    near: [ '0', '0' ],
    maxDistance: '90',
    query: { userName: { '$regex': '^test' } }
  }

Единственное, что не понятно, как Mongo связей в месте, указанному в запросе, на расположение документа. В моем случае пользователи документе есть поле с именем lastKnownPosition. Как работает Mongo даже знаю, на запрос к этому полю?

Вот пример результатов поиска:

  { 
      "__v" : 0 , 
      "_id" : { "$oid" : "5413824f8b4d6f7505120a53"} , 
      "lastKnownPosition" : { "lon" : 0 , "lat" : 0} ", 
      "userName" : "test123"
  }
===== Клиенты =====

  * http://3t.io/mongochef/download/platform
  * http://robomongo.org/
  * https://github.com/jeromelebel/MongoHub-Mac
  * https://docs.mongodb.org/ecosystem/tools/administration-interfaces/
  * http://mongodb-tools.com/

===== Статьи =====

  * [[https://habrahabr.ru/post/251745/|Анонс MongoDB 3]]
  * [[https://habrahabr.ru/post/252129/|Вышла Mongodb 3.0 Production Release]]
  * [[https://habrahabr.ru/post/192870/|Релиз mongodb 3.2 немного подробностей]]