MongoDBのあれこれのメモ
mongoDBをイジる上で備忘録的に追記していく。
(1)ログイン
% mongo MongoDB shell version: 2.6.1
connecting to: test
> use hoge
これでクライアントを起動しDBの選択が出来る。
ちなみに起動時にDBを選択することも可能。
% mongo hoge
MongoDB shell version: 2.6.1
connecting to: hoge
>
設定ファイルを書き換えるとリモートのアドレスを指定することも可能。
bind_ipで制限されているのでコメントアウトする。
# Listen to local interface only. Comment out to listen on all interfaces.
bind_ip=127.0.0.1
# Listen to local interface only. Comment out to listen on all interfaces.
# bind_ip=127.0.0.1
% mongo example.com:27017/hoge
MongoDB shell version: 2.6.1
connecting to: hoge
>
リモートでログインできない場合はポート番号があっているかとかそもそもポートが開いていない場合があるので確認を。
IPアドレスベースでのアクセス制限が出来ない(するほうほうがあれば教えて欲しい)ので、iptablesで制限するかmongoDBの設定でauthで認証をかける。
# Turn on/off security. Off is currently the default
#noauth=true
auth=true
次に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 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/