メモ書き。
間違いがあったらごめんなさい。
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: { $eq: 'mogeta' } } );
money != 'mogeta'
db.COL.find( { money: { $ne: 'mogeta' } } );
name(配列) から 'mogeta' or 'mogeta3' のものを抽出
db.COL.find( { name: { $in: ['mogeta','mogeta3'] } } ) );
name(配列) から 'mogeta' or 'mogeta3' が入っていないものを抽出
db.COL.find( { name: { $nin: ['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);
結果を整形して表示する
pretty()を使う
db.COL.findOne( { name: 'mogeta' } ).pretty();
指定したドキュメントから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 } );