MongoDB
DB
mongo
バックアップ
チューニング
More than 3 years have passed since last update.

MongoDBのあれこれのメモ

mongoDBをイジる上で備忘録的に追記していく。

(1)ログイン

mongoでのDB選択
% mongo                                                                                                  MongoDB shell version: 2.6.1
connecting to: test
> use hoge

これでクライアントを起動しDBの選択が出来る。
ちなみに起動時にDBを選択することも可能。

mongoでのDB選択
% mongo hoge
MongoDB shell version: 2.6.1
connecting to: hoge
>

設定ファイルを書き換えるとリモートのアドレスを指定することも可能。
bind_ipで制限されているのでコメントアウトする。

mongo.conf変更前
# Listen to local interface only. Comment out to listen on all interfaces.
bind_ip=127.0.0.1
mongo.conf変更後
# Listen to local interface only. Comment out to listen on all interfaces.
# bind_ip=127.0.0.1
mongoでのリモートログイン
% mongo example.com:27017/hoge
MongoDB shell version: 2.6.1
connecting to: hoge
>

リモートでログインできない場合はポート番号があっているかとかそもそもポートが開いていない場合があるので確認を。

IPアドレスベースでのアクセス制限が出来ない(するほうほうがあれば教えて欲しい)ので、iptablesで制限するかmongoDBの設定でauthで認証をかける。

mongo.conf変更後
# Turn on/off security.  Off is currently the default
#noauth=true
auth=true

次にDB毎に権限を付与してログインしてみる。

mongoでのDB
% mongo
> use admin
> db.createUser({ user: "admin", pwd: "adminpass", roles: ["userAdminAnyDatabase"] })

% mongo admin -u admin -p adminpass
> use hoge
> db.createUser({ user: "hoge_user", pwd: "hogehoge", roles: ["readWrite"] })

ip_bindをコメントアウトしてauthを設定していればこれでいける

mongoでのリモートログイン
% mongo example.com:27017/hoge -u hoge_user -p hogehoge 
MongoDB shell version: 2.6.1
connecting to: hoge
>

roleで設定してある権限は以下を参照。
createRoleで新しい権限も作れるらしい(試してない)
mongoDB - Manage User and Roles

(2)mongoDBでの検索

そもそものMySQLとmongoDBの対応表らしきものを

MySQL mongoDB
DB DB
table collection
record document
column field

基本的にDBやcollectionは作らなくてもinsertするときに作られます。
MySQLでのレコードでは同じテーブル上であえば同じカラムですが、mongoDBでは自由にfieldを決めてinsert出来ます。

条件なし

> db.hoge_col.find()
まずこれが基本形で、MySQLだとこんな感じ。
select * from hoge.hoge_col;

1件だけ取得

> db.hoge_col.find().limit(1)

主キー検索:idがabcdefgのものを取得

> db.hoge_col.find({"_id": ObjectId("abcdefg")})

基本的な条件検索:nameがhogeのものを取得

> db.hoge_col.find({"name": "hoge"})

ノットイコール(≠):nameがhogeではないものを取得

> db.hoge_col.find({"name": {$ne: "hoge"}})

カウント:nameがhogeのドキュメント数を取得

> db.hoge_col.find({"name": "hoge"}).count()

>=での検索:scoreが80以上ものを取得

> db.hoge_col.find({"score": {$gte: 80}})

>での検索:scoreが80より大きいものを取得

> db.hoge_col.find({"score": {$gt: 80}})

<=での検索:scoreが80以下ものを取得

> db.hoge_col.find({"score": {$lte: 80}})

<での検索:scoreが80より小さいものを取得

> db.hoge_col.find({"score": {$lt: 80}})

AND条件:nameがhogeかつscoreが80以上ものを取得

> db.hoge_col.find({$and: [{"name": "hoge"}, {"socre": {$gte: 80}}]}))

OR条件:nameがhogeまたはscoreが80以上ものを取得

> db.hoge_col.find({$or: [{"name": "hoge"}, {"socre": {$gte: 80}}]}))

ユニーク条件:nameフィールドにdistictの条件をつけて検索

> db.hoge_col.distinct({"name"})

ユニーク条件に検索条件を付ける:scoreが80以上のnameフィールドにdistinctの条件をつけて検索

> db.hoge_col.distinct("name", {"socre": {$gte: 80}})

ユニーク条件でのカウント:nameフィールドにdistictの条件をつけてカウント

countではなくlength
> db.hoge_col.distinct("name").length

(3)スロークエリの調査&インデックス

後日

(4)バックアップ&転送

後日

参考

http://dqn.sakusakutto.jp/2013/03/mongodb_migration_merge.html
http://qiita.com/hiromisawada/items/ec266e423d7b273cd239
http://tweeeety.hateblo.jp/entry/20140311/1394528997
http://kozy4324.github.io/blog/2012/06/19/mongodb-index/