Edited at

MongoDB コマンドメモとか書き

メモ書き。

間違いがあったらごめんなさい。


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 } );