For Want Of A Better Word

MongoDBのインストールから、insert select delete update

      2015/04/19

CentOS MongoDBインストール

大体ここからで完結する。素晴らしい。
http://kzy52.com/entry/2013/07/15/225402

以下のメモ。

MongoDBサーバーの起動・停止・再起動

/etc/init.d/mongod start # 起動
/etc/init.d/mongod stop# 停止
/etc/init.d/mongod restart # 再起動

MongoDBのコマンドラインからの操作

mongo # MongoDBクライアントの起動
db.version(); # バージョン確認のコマンド
2.4.8 # 結果
db.help();# ヘルプの表示

使い方

以下、下記「MongoDBの薄い本」より
http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf

構造について

MongoDBスキーマ※括弧内はRDBの近い用語
インスタンス (=インスタンス)

  • DB (=DB)
    • コレクション (= テーブル)
      • ドキュメント(= 行)
        • フィールド (= 列)

※インデックスあり
※カーソル(…?ちょっと分からん。RDBのカーソルとは違うのかな。)

DBの選択 insert select delete

use learn# learnがDB名。DBの作成は不要。
db.unicorns.insert({name:’Aurora’, gender:’f’, weight:450}) # insert
db.unicorns.find();# select
db.unicorns.remove() # delete

クエリーセレクター

whereの類似。一般的なKVSにはない。MongoDBの特徴かも。
ドキュメントの指定に使う。フィールドの値を条件にすることも可能。
find(),remove(),update()で使える。

  • 準備・実習用データ登録文

db.unicorns.insert({name:’Horny’,dob:new Date(1992,2,13,7,47),loves: [‘carrot’,’papaya’],weight: 600,gender:’m’,vampires: 63})
db.unicorns.insert({name:’Aurora’,dob:new Date(1991, 0, 24, 13, 0),loves: [‘carrot’,’grape’],weight: 450,gender:’f’,vampires: 43});
db.unicorns.insert({name:’Unicrom’,dob:new Date(1973, 1, 9, 22, 10),loves: [‘energon’,’redbull’],weight: 984,gender:’m’,vampires: 182});
db.unicorns.insert({name:’Roooooodles’,dob:new Date(1979, 7, 18, 18, 44),loves: [‘apple’],weight: 575,gender:’m’,vampires: 99});
db.unicorns.insert({name:’Solnara’,dob:new Date(1985, 6, 4, 2, 1),loves:[‘apple’,’carrot’,’chocolate’],weight:550,gender:’f’,vampires:80});
db.unicorns.insert({name:’Ayna’,dob:new Date(1998, 2, 7, 8, 30),loves: [‘strawberry’,’lemon’],weight: 733,gender:’f’,vampires: 40});
db.unicorns.insert({name:’Kenny’,dob:new Date(1997, 6, 1, 10, 42),loves: [‘grape’,’lemon’],weight: 690,gender:’m’,vampires: 39});
db.unicorns.insert({name:’Raleigh’,dob:new Date(2005, 4, 3, 0, 57),loves: [‘apple’,’sugar’],weight: 421,gender:’m’,vampires: 2});
db.unicorns.insert({name:’Leia’,dob:new Date(2001, 9, 8, 14, 53),loves: [‘apple’,’watermelon’],weight: 601,gender:’f’,vampires: 33});
db.unicorns.insert({name:’Pilot’,dob:new Date(1997, 2, 1, 5, 3),loves: [‘apple’,’watermelon’],weight: 650, gender:’m’,vampires:54});
db.unicorns.insert({name:’Nimue’,dob:new Date(1999, 11, 20, 16, 15),loves: [‘grape’,’carrot’],weight: 540,gender:’f’});
db.unicorns.insert({name:’Dunx’,dob:new Date(1976, 6, 18, 18, 18),loves: [‘grape’,’watermelon’],weight: 704,gender:’m’,vampires:165});

  • クエリーセレクターをつかった実行文

# and (,区切りで条件指定。)
db.unicorns.find({gender:{$ne:’f’}, weight:{$gte:701}});

# or ($or{}内に条件を入れる。)
db.unicorns.find({gender:{$ne:’f’}, $or{:weight:701}});

比較演算子
  • $lt ⇒未満
  • $lte⇒以下
  • $gt ⇒より大きい
  • $gte⇒以上
  • $ne ⇒ノットイコール

他詳細は公式ページへ
http://docs.mongodb.org/manual/reference/operator/#AdvancedQueries

IDを指定する場合

db.unicorns.find({_id:”TheObjectId”});

更新 update

・ドキュメントの置き換え

db.unicorns.update({name:”Roooooodles”}, {weight:590}); #第1引数 = セレクタ、第2引数が項目と値。

・項目の更新

db.unicorns.update({name:”Roooooodles”}, {$set:{weight:590}}); #第1引数 = セレクタ、第2引数が項目と値。 $setを使わないと、フィールドの値では無くドキュメントを丸々置き換える。

・upsert(条件に一致するものが存在する場合、更新。無ければ挿入)

db.unicorns.update({name:”Roooooodles”}, {$set:{weight:590}}, true); #第3引数をtrueに。

・複数一括更新

db.unicorns.update({}, {weight:590}, false, true); #第4引数をtrueに。falseの場合は最初の1件だけが更新される。

一旦区切り。

その他 感想・参考

後に示した例にはとても素敵なものがあります。
すでに知っていると思いますがlovesフィールドは配列です。
MongoDBはファーストクラスオブジェクトとしての配列をサポートしています。
これはとんでもなく便利な機能です。一度これを使ってしまうと、これ無しでは生活できなくなる恐れがあります。
何よりも興味深いのは配列の値に基づいて簡単に選択できることです。
{loves:’watermelon’}はlovesの値にwatermelonを持つドキュメントを返します。

これ凄い。配列内検索が楽ってすごい。

「スキーマレスの本当の利点はセットアップの省略とオブジェクト指向プログラミングとの摩擦の低減です。」

これに尽きるのかな。

Cappedコレクション

この場合、Cappedコレクションが1MByteの上限に達した時、古いドキュメントは自動的に削除されます。

# sample
db.createCollection(‘logs’, {cappde: true, size:1048576})

NoSQLの分類

NoSQLの分類と、どの製品がどれなのかが分かりやすかった。
http://gihyo.jp/dev/serial/01/mongodb/0001

 - db, mongodb

  関連記事

mysql-logo
mysqlのログの種類と内容

[bashだけど参考。。] http://blog.livedoor.jp/my …

mysql-logo
Amazon EC2を使う!! すげーと思う。

うおー俺のサイトを作るぞ。ということで、amazonEC2でWEBサーバーをたて …

mongo-logo
【MongoDB】強制再起動したらmongoが立ち上がらない!

起動でfals …

lgi01a201309210900
PHP SQLインジェクション

全ての入力はフィルタリングし、すべての出力はエスケープする。 インジェクションの …

mysql-logo
プログラミングPHP 第13章( アプリケーションに関するテクニック )ポイント

コードライブラリ 複数の関数をコードライブラリにまとめる際には、「どの関数とどの …