MongoDBのシェルコマンド達を集めてみた


```js
// 接続
mongo --host 127.0.0.1 --port 27017  --authenticationDatabase hoge_test -u testuser -p
パスワード
  
// 接続　シンプル（こちらだと、use hoge_testしなくても良い。）
mongo 127.0.0.1:27017/hoge_test -u testuser -p
 
// 接続　シンプル＆フルパスバージョン
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/hoge_test -u testuser -p
 
// 接続　Unix Domain Socketバージョン（対象のサーバに入って実行となります）（mongos or mongodがudsで起動している必要があります）
/usr/local/mongodb/bin/mongo -u testuser -p --host /tmp/mongodb-27017.sock hoge_test
  
// DB選択
mongos> use hoge_test

// secondlyのmongodにログインした場合のみ必要（mongos経由だったり、masterのmongodであれば不要です）
mongos> rs.slaveOk()
 
// シャード環境でmongos経由でsecondaryに対してクエリを発行する場合（writeが発生しているmasterを見に行くよりは優しい）
db.getMongo().setReadPref('secondary');
//  確認
db.getMongo().getReadPref()
> { "mode" : "secondary" }
  
// コレクション探す
mongos> show collections;
ずらっと
  
// 普通にfind（デフォルトlimit付きなので全件いかないから安心して打てる）
mongos> db.TEST_M.find()
{ "_id" : ObjectId("5b052e2f17e2152fae04df39"), "id" : 1 }
Type "it" for more
 
// jsonを見やすく
mongos> db.TEST_M.find().pretty()
みやすいjson形式
 
// findOneだとfindと違いカーソルオブジェクトではなく、jsonオブジェクトで帰ってくるため、単変数表示用の見やすいjsonが出てくる
mongos> db.TEST_M.findOne()
みやすいjson形式

// カウントとかもある
mongos> db.TEST_M.count()
94
 
// コマンドライン内では、タブキーを押せば補完が効くので、使ってみてください（色々と試してみると発見があると思います）

// oneline
mongos> db.TEST_M.find().limit(1).forEach(function(obj){printjsononeline(obj);})
{ "_id" : ObjectId("5b052e2f17e2152fae04df39"), "id" : 1 }
 
// pretty
mongos> db.TEST_M.find().limit(1).forEach(function(obj){printjson(obj);})
{
    "_id" : ObjectId("5b052e2f17e2152fae04df39"),
    "id" : 1
}

// paging 1 - 3 page
db.TEST_M.find().skip(0).limit(5)
db.TEST_M.find().skip(5).limit(5)
db.TEST_M.find().skip(10).limit(5)
  
// 実践的なシェル例
var result = {comp: 0, notComp: 0};
db.TEST_M.find().limit(20).forEach(function(obj){
  if (obj.iscomp) {
    result.comp++;
  } else {
    result.notComp++;
  }
  // 他のコレクションをさらに検索することも可能
  // db.HOGE.find({id: obj.id}).forEach(function(){});

  // 中でupdateなどをする場合は、db.TEST_M.find().sort()のようにsort指定しておかないと、永久に終わらない場合があるので注意です。
  // 適当にソートするなら、_idがおすすめです。
  // db.HOGE.find({id: obj.id}).sort({_id:1}).forEach(function(){});
})
printjson(result);
{ "comp" : 7, "notComp" : 13 }
 
 
// DB内のコレクションに設定されているインデックスを一括出力してみた
db.getCollectionNames().sort().forEach(function(name){
  print(name);
  db[name].getIndexes().sort().forEach(function(d){
    printjson(d.key)
  });
})
 
// タブ区切り
db.getCollectionNames().sort().forEach(function(name){
  var aaa = name;
  db[name].getIndexes().sort().forEach(function(d){
    aaa += '\t' + JSON.stringify(d.key);
  });
  print(aaa);
})
 
// 外部ファイル実行（なんかうまくいってない気もしますが。。）
mongo --quiet 127.0.0.1:27017/hoge_test -u testuser -p --shell aaa.js > bbb.log
 
// mongo export csvファイルで出力する
mongoexport --host 127.0.0.1 --port 27017 --authenticationDatabase hoge_test -u testuser --csv --db hoge_test --collection TEST_M --out /tmp/aaa.csv --fields id -q '{"id":1}' -p
パスワード

// dump（圧縮あり）
mongodump -h 127.0.0.1 --port 27017 --gzip --db hoge_test
// --collection を指定もできる

// restore（圧縮あり） 
// --dropを付けないとデータが存在する場合、addっぽい挙動になる
// フォルダの名前がdumpじゃないとrestoreしないとか言い張るみたい。。。
// ユーザとパスワードが設定されている場合
// -u hogeuser --authenticationDatabase hogedb で、認証用のDBを指定する必要もある
mongorestore -h 127.0.0.1 --port 27017 --gzip --drop --db hoge_test dump/

// TTL indexは、時間になったら必ず消えるわけではない。次の監視タイミングで消える。
// TTL index（expireAtに指定した時間になったら消す）
db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
db.log_events.insert( {"expireAt": new Date('July 22, 2013 14:00:00')} )

// TTL index（作成時間から3分経過したら消す）
db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 180 } )
db.log_events.insert( {"createdAt": new Date('July 22, 2013 14:00:00')} )

// プロファイリングの状態を見れるコマンド
db.getProfilingStatus()

// プロファイリングレベルの設定
db.setProfilingLevel(2, {slowms:0, sampleRate:1})

```

毎度忘れてググるから、メモ的なやつです。

気になることあるかたは、ほんわかレスで指摘していただけると幸いです。