mattak's blog

気の向くままに書く

mongodbつかってみる

なぜ?

7つのデータベース、7つの世界をよんだら、mongodbつかってみたくなったから。 http://www.amazon.co.jp/dp/4274069087

技術ありきで、作りたいものがないという。。

インストール

ミーハーなので最新版を。

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$ curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.0.tgz
$ sudo vim /etc/apt/sources.list.d/10gen.list 

下記を追加

"deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen"

パッケージをアップデート

$ sudo apt-get update

2.4.0のインストール

$ sudo apt-get install mongodb-10gen=2.4.0

設定ファイルの場所

$ cat /etc/mongodb.conf

データの保存場所

$ ls /var/lib/mongodb

サービスの起動

$ sudo service mongodb start

使ってみる

$ mongo

おおーうごいた。

基本操作

基本操作を覚える http://docs.mongodb.org/manual/tutorial/getting-started/

データベースにつなげる

起動

$ mongo

現在のデータベースを表示

> db
test

データベースリストの表示

> show dbs

新しいデータベースに切り替える

> use mydb

collectionを作る。documentを挿入する。

jとkというドキュメントを作る

> j = { name: "mongo" }
> k = { x : 3 }

thingsというcollectionにj,kのドキュメントを追加する

> db.things.insert(j);
> db.things.insert(k);

collectionの一覧を表示する

> show collections

collection内のドキュメントを表示する

> db.things.find()
{ "_id" : ObjectId("514d9d5d41e70994840e6c01"), "name" : "mongo" }
{ "_id" : ObjectId("514d9d6541e70994840e6c02"), "x" : 3 }

全部のドキュメントには_idが自動で挿入される

forループを使って、ドキュメントを挿入する

> for (var i=1; i<10; i++) db.things.insert({x: 1, y: i})
> db.things.find()
{ "_id" : ObjectId("514d9d5d41e70994840e6c01"), "name" : "mongo" }
{ "_id" : ObjectId("514d9d6541e70994840e6c02"), "x" : 3 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c03"), "x" : 1, "y" : 1 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c04"), "x" : 1, "y" : 2 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c05"), "x" : 1, "y" : 3 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c06"), "x" : 1, "y" : 4 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c07"), "x" : 1, "y" : 5 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c08"), "x" : 1, "y" : 6 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c09"), "x" : 1, "y" : 7 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c0a"), "x" : 1, "y" : 8 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c0b"), "x" : 1, "y" : 9 }

cursorを使って移動する

> while ( c.hasNext() ) printjson( c.next() )
{ "_id" : ObjectId("514d9d5d41e70994840e6c01"), "name" : "mongo" }
{ "_id" : ObjectId("514d9d6541e70994840e6c02"), "x" : 3 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c03"), "x" : 1, "y" : 1 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c04"), "x" : 1, "y" : 2 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c05"), "x" : 1, "y" : 3 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c06"), "x" : 1, "y" : 4 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c07"), "x" : 1, "y" : 5 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c08"), "x" : 1, "y" : 6 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c09"), "x" : 1, "y" : 7 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c0a"), "x" : 1, "y" : 8 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c0b"), "x" : 1, "y" : 9 }

特定要素へのアクセス

> var c = db.things.find()
> printjson(c[4])
{ "_id" : ObjectId("514d9f6c41e70994840e6c05"), "x" : 1, "y" : 3 }

特定ドキュメントの検索

> db.things.find( { x : 4 } )
> { "_id" : ObjectId("514d9f6c41e70994840e6c03"), "x" : 1, "y" : 1 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c04"), "x" : 1, "y" : 2 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c05"), "x" : 1, "y" : 3 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c06"), "x" : 1, "y" : 4 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c07"), "x" : 1, "y" : 5 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c08"), "x" : 1, "y" : 6 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c09"), "x" : 1, "y" : 7 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c0a"), "x" : 1, "y" : 8 }
> { "_id" : ObjectId("514d9f6c41e70994840e6c0b"), "x" : 1, "y" : 9 }

findの第二引数はprojectionする引数。 下の場合、y という値を1=trueで表示しろという意味。 {y:0}とすれば、yは表示されない。

> db.things.find({ x: 1 }, { y: 1 } )
{ "_id" : ObjectId("514d9f6c41e70994840e6c03"), "y" : 1 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c04"), "y" : 2 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c05"), "y" : 3 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c06"), "y" : 4 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c07"), "y" : 5 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c08"), "y" : 6 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c09"), "y" : 7 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c0a"), "y" : 8 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c0b"), "y" : 9 }

1行だけ表示

> db.things.findOne()

limitをもうける

> db.things.find().limit(3)
{ "_id" : ObjectId("514d9d5d41e70994840e6c01"), "name" : "mongo" }
{ "_id" : ObjectId("514d9d6541e70994840e6c02"), "x" : 3 }
{ "_id" : ObjectId("514d9f6c41e70994840e6c03"), "x" : 1, "y" : 1 }