MongoDBのチュートリアルを進めてみたよ

http://www.mongodb.org/pages/viewpage.action?pageId=5079135をやってみた。
node.jsと相性のいい、ってたまに見るけどどういう意味かわかったかも。

データの挿入

> a = { tags: ['aaa', 'bbb', 'ccc']};
{ "tags" : [ "aaa", "bbb", "ccc" ] }
> db.node.save(a);
> db.node.find();
{ "_id" : ObjectId("4de7af774924185501981a3f"), "tags" : [ "aaa", "bbb", "ccc" ] }

JavaScriptそのものをいじってる、って考えると(実際JavaScriptそのものだけど)抵抗がなくなった。
そう考えるとコレクションとかが保存したときに初めて作成される、ってのも変な感じしないかも。

たくさんのデータを挿入

> for (var i = 1; i <= 20; i++) {
...  db.node.save({ key: i, value: i + i });
...}
> db.node.find();
{ "_id" : ObjectId("4de7af774924185501981a3f"), "tags" : [ "aaa", "bbb", "ccc" ]
 }
{ "_id" : ObjectId("4de7b0024924185501981a40"), "key" : 1, "value" : 2 }
{ "_id" : ObjectId("4de7b0024924185501981a41"), "key" : 2, "value" : 4 }
{ "_id" : ObjectId("4de7b0024924185501981a42"), "key" : 3, "value" : 6 }
{ "_id" : ObjectId("4de7b0024924185501981a43"), "key" : 4, "value" : 8 }
{ "_id" : ObjectId("4de7b0024924185501981a44"), "key" : 5, "value" : 10 }
{ "_id" : ObjectId("4de7b0024924185501981a45"), "key" : 6, "value" : 12 }
{ "_id" : ObjectId("4de7b0024924185501981a46"), "key" : 7, "value" : 14 }
{ "_id" : ObjectId("4de7b0024924185501981a47"), "key" : 8, "value" : 16 }
{ "_id" : ObjectId("4de7b0024924185501981a48"), "key" : 9, "value" : 18 }
{ "_id" : ObjectId("4de7b0024924185501981a49"), "key" : 10, "value" : 20 }
{ "_id" : ObjectId("4de7b0024924185501981a4a"), "key" : 11, "value" : 22 }
{ "_id" : ObjectId("4de7b0024924185501981a4b"), "key" : 12, "value" : 24 }
{ "_id" : ObjectId("4de7b0024924185501981a4c"), "key" : 13, "value" : 26 }
{ "_id" : ObjectId("4de7b0024924185501981a4d"), "key" : 14, "value" : 28 }
{ "_id" : ObjectId("4de7b0024924185501981a4e"), "key" : 15, "value" : 30 }
{ "_id" : ObjectId("4de7b0024924185501981a4f"), "key" : 16, "value" : 32 }
{ "_id" : ObjectId("4de7b0024924185501981a50"), "key" : 17, "value" : 34 }
{ "_id" : ObjectId("4de7b0024924185501981a51"), "key" : 18, "value" : 36 }
{ "_id" : ObjectId("4de7b0024924185501981a52"), "key" : 19, "value" : 38 }
has more

たくさんあると"has more"を表示して終わるので、その後も見たいときは

> it
{ "_id" : ObjectId("4de7b0024924185501981a53"), "key" : 20, "value" : 40 }

ってやると見れる。


最初のドキュメントと2個目以降のドキュメントの中身が違うのに、同じコレクションに入ってるのはやっぱりRDBをちょっとでも見てきてるからかな、変な感じに思える。すぐ慣れるだろうけど。

イテレータを使ってデータを見る

Javaじゃあるまいし、JavaScriptイテレータってのも変な感じだけど……

> cursor = db.node.find();
> while (cursor.hasNext()) {
...  printjson(cursor.next())
...}
{ 
        "_id" : ObjectId("4de7af774924185501981a3f"),
        "tags" : [
                "aaa",
                "bbb",
                "ccc"
        ]
} 
{ "_id" : ObjectId("4de7b0024924185501981a40"), "key" : 1, "value" : 2 }
{ "_id" : ObjectId("4de7b0024924185501981a41"), "key" : 2, "value" : 4 }
{ "_id" : ObjectId("4de7b0024924185501981a42"), "key" : 3, "value" : 6 }
{ "_id" : ObjectId("4de7b0024924185501981a43"), "key" : 4, "value" : 8 }
{ "_id" : ObjectId("4de7b0024924185501981a44"), "key" : 5, "value" : 10 }
{ "_id" : ObjectId("4de7b0024924185501981a45"), "key" : 6, "value" : 12 }
{ "_id" : ObjectId("4de7b0024924185501981a46"), "key" : 7, "value" : 14 }
{ "_id" : ObjectId("4de7b0024924185501981a47"), "key" : 8, "value" : 16 }
{ "_id" : ObjectId("4de7b0024924185501981a48"), "key" : 9, "value" : 18 }
{ "_id" : ObjectId("4de7b0024924185501981a49"), "key" : 10, "value" : 20 }
{ "_id" : ObjectId("4de7b0024924185501981a4a"), "key" : 11, "value" : 22 }
{ "_id" : ObjectId("4de7b0024924185501981a4b"), "key" : 12, "value" : 24 }
{ "_id" : ObjectId("4de7b0024924185501981a4c"), "key" : 13, "value" : 26 }
{ "_id" : ObjectId("4de7b0024924185501981a4d"), "key" : 14, "value" : 28 }
{ "_id" : ObjectId("4de7b0024924185501981a4e"), "key" : 15, "value" : 30 }
{ "_id" : ObjectId("4de7b0024924185501981a4f"), "key" : 16, "value" : 32 }
{ "_id" : ObjectId("4de7b0024924185501981a50"), "key" : 17, "value" : 34 }
{ "_id" : ObjectId("4de7b0024924185501981a51"), "key" : 18, "value" : 36 }
{ "_id" : ObjectId("4de7b0024924185501981a52"), "key" : 19, "value" : 38 }
{ "_id" : ObjectId("4de7b0024924185501981a53"), "key" : 20, "value" : 40 }

あとはforEach()が使えたりとか。

> db.node.find().forEach(printjson)

WHERE句を指定

WHERE句って呼び方でいいのかはわからないけど。

SELECT * FROM node WHERE key = 19;

を指定したものが以下に。

> db.node.find({key:19}).forEach(printjson)
{ "_id" : ObjectId("4de7b0024924185501981a52"), "key" : 19, "value" : 38 }


valueだけ欲しい時、RDBでは

SELECT value FROM node WHERE key = 19;

こんなかな?これをMongoDBで書くと

> db.node.find({key:19},{value:true}).forEach(printjson)
{ "_id" : ObjectId("4de7b0024924185501981a52"), "value" : 38 }

になる。"_id"は必ず返されるみたい。

指定個数のみ取得

SQLだとどう書くんだろう。

> db.node.find({}, {value:true}).limit(5);      
{ "_id" : ObjectId("4de7af774924185501981a3f") }
{ "_id" : ObjectId("4de7b0024924185501981a40"), "value" : 2 }
{ "_id" : ObjectId("4de7b0024924185501981a41"), "value" : 4 }
{ "_id" : ObjectId("4de7b0024924185501981a42"), "value" : 6 }
{ "_id" : ObjectId("4de7b0024924185501981a43"), "value" : 8 }

最初の5つのみ取得する。パフォーマンス的にもいいみたいなので、すべてを取得する必要がない場合は必ず指定するといいかも。

メソッドの中身を見てみる

> printjson
function (x) {
    print(tojson(x));
}

メソッドに括弧を付けないとシェルから直接コードが見れる。


次はマニュアルを読み進めるかなー。