MongoDB

MongoDB コマンドメモとか書き

More than 1 year has passed since last update.

メモ書き。
間違いがあったらごめんなさい。

MongoDBの構造

- DB
 - Collection
   - Document
   - Document
   - Document
   - Document
   - Document
   - Document

Collectionがtableみたいなもので、Documentがレコードみたいなもの。
順序的にはDBを作って、Collectionを作って、Documentをinsertするようなイメージ。

DB操作

DB作成

$ mongo dbname
use dbname
  • コレクションが無いとDB一覧には出ない
  • use dbnameで使うDB切り替え
  • mongo だけで起動するとtestで起動される

DB削除

db.dropDatabase();

DB一覧

show dbs

コレクション操作

コレクション一覧

show collections

コレクション作成

COL というCollectionを作成

db.createCollection('COL');

コレクションの削除

COL というCollectionを削除

db.COL.drop();

ドキュメント操作

コレクションにドキュメントを追加

db.COL.insert( { name:'mogeta', mogemoge:'mogegeee' } );

コレクションのドキュメントの更新

基本的な更新

MongoDBは、multiフラグを指定しなければ最初にマッチしたドキュメントだけしか更新されない。
以下はname が 'mogeta'のドキュメントの プロパティに対して操作を行うとき。

'money' のプロパティを更新

db.COL.update( { name:'mogeta' }, { $set:{ money: 9999999 } } );

'money' のプロパティを削除

db.COL.update( { name:'mogeta' }, { $unset:{ money: "" } } );

'money' のプロパティに10を加算

db.COL.update( { name:'mogeta' }, { $inc:{ money: 10 } } );

'money' のプロパティに10を減算

db.COL.update( { name:'mogeta' }, { $inc:{ money: -10 } } );

'money' のプロパティ名を 'mymoney' に変更

db.COL.update( { name:'mogeta' }, { $rename:{ money: "mymoney" } } );
注意

下記のやり方だとドキュメントが{ money: 9999999 }になってしまう!

db.COL.update( { name:'mogeta' }, { money: 9999999 } );

複数のドキュメントを一律更新する場合

MongoDBは、multiフラグを指定しなければ最初にマッチしたやつだけしか更新されない。

db.COL.update( { name: /mogeta/ }, { $set:{ money: 1000000 } }, { multi:true } );

コレクション内のドキュメントがあれば更新、なければ追加

upsert的な

update

db.COL.update( { name:'mogeta' }, { name:'mogeta', mogemoge:'mogegeee' }, { upsert:true } );

save

_idがあれば可能。

db.COL.save( { _id: ObjectId("51b9bbad15349740afd96f99"), name:'mogeta2' } );
  • _idがなければずっと新しいドキュメントが追加される。何時使うのかな・・・。

コレクション内のドッキュメント全件削除

db.COL.remove();

特定の値を持っているものだけ削除

db.COL.remove( { name: 'mogeta' } );
  • こちらはupdateと違ってmultiフラグを指定しなくても、該当するドキュメントが全部削除される

コレクション内のドッキュメント取得

select的な

全件取得

db.COL.find();
db.COL.find( {} );

コレクションの特定のドキュメントを取得

db.COL.find( { name:'mogeta' } );

正規表現を使って取得

db.COL.find( { name:/mogeta/ } );
  • 私は正規表現を使う機会はないので余り試していない・・。

その他の条件指定

money > 30
db.COL.find( { money: { $gt: 30 } } );
money >= 30
db.COL.find( { money: { $gte: 30 } } );
money < 30
db.COL.find( { money: { $lt: 30 } } );
money <= 30
db.COL.find( { money: { $lte: 30 } } );
money != 'mogeta'
db.COL.find( { money: { $ne: 'mogeta' } } );
name が 'mogeta' or 'mogeta3' のものを抽出
db.COL.find( { name: { $in: ['mogeta','mogeta3'] } } ) );

複数条件

And

2通りある

以下は name が 'mogeta' で、money が 1000000 以上のものを取得

find にそのまま複数指定

db.COL.find({
  name  : 'mogeta',
  money : { $gt : 1000000  }
});

And(演算子)

記述は長いけどコチラのほうが色々できそう(なきがしているだけ)

db.COL.find({
  $and: [
    { name  : 'mogeta' },
    { money : { $gt : 1000000  } }
  ]
});

OR

以下は name が 'mogeta'か'mogeta3' で、money が 1000000 以上のものを取得

or(演算子)

db.COL.find({
  $or: [
    { name: { $in: ['mogeta','mogeta3'] } },
    { money : { $gt : 1000000  } }
  ]
});

取得するプロパティを指定

なにも指定しなければ、ドキュメントの値が全て取得できてしまう。
'_id'とか不要なことも多いと思うので、不要なデータを受け取らずにするにはこの項目の方法を参照

db.COL.find( { name: { $in: ['mogeta','mogeta3'] } }, { name:1 } );
  • 1と0で表示非表示。ただし、1と0を混在させることはできない。;

NG パターン;

db.COL.find( { name: { $in: ['mogeta','mogeta3'] } }, { name:1,money:0 } );

OK パターン;

db.COL.find( { name: { $in: ['mogeta','mogeta3'] } }, { name:1, _id:0 } );
  • IDだけは例外で許容される仕様らしい

取得する件数の指定

limitのほうが応用が効きそう

ドキュメントを最初の一件だけ取得する場合

fineOneを使う

db.COL.findOne( { name: { $in: ['mogeta','mogeta3'] } }, { name:1, _id:0 } );
ドキュメントを3件だけ取得する場合

limitを使う

db.COL.find( { name: 'mogeta' } ).limit(3);
指定したドキュメントからlimitで指定された分のドキュメントを取得

2件飛ばした位置から3件取得

db.COL.find( { name: 'mogeta' } ).skip(2).limit(3);

ソートの指定

昇順: 1
降順: -1

db.COL.find().sort( { money:-1 } );

ドキュメントの件数を取得

db.COL.count();

重複レコードの除去(distinct)

nameのプロパティで重複しているもの以外の値を重複データを除いて取得

db.COL.distinct( 'name' );

インデックス

昇順: 1
降順: -1

一覧

db.COL.getIndexes();

追加

db.COL.ensureIndex( { name : 1 } );

削除

db.COL.dropIndex( { name : 1 } );