そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

DB - MongoDB(1)

MongoDBについて

http://www.mongodb.org/

ドキュメント指向のNoSQLなDBMSです。スキーマが無いのでリレーショナルデータベースよりも楽ができます。

ウリはスケーリングの容易さとRDBの良さであるクエリや検索を充実させているところのようです。オープンソースのコードですが、企業向けのサポートや教育も行っているので、商用ベースで普及してきています。

http://www.mongodb.com/leading-nosql-database

JSONドキュメントを格納します。サーバサイトはJavaScriptで記述しますが、クライアントは各種言語のインタフェースが用意されています。(C++,C#,Java,Ruby,Perl,PHP,Python...)

 

インストール

$ sudo yum install mongo mongo-server
$ sudo service mongod start

対話型クライアント

デフォルトで使用するポートは 27017で、データベースは test に接続します

$ mongo
connecting to: test
>  ...   (> はmongoのプロンプト)

DBの切り替えはuseコマンドで行います

> use bibio_db
switched to db bibio_db

存在しないDBを指定した場合は新規に作成されるようです。(厳密にいうと初回レコード登録時。)

Create

コレクション(RDBでのテーブルに相当) booksにドキュメントを新規作成します

> db.books.save( { title: "A tiny tired article", author: "bibio"} )

ドキュメントはJavaScriptオブジェクト(JSON)で指定します。

Read

登録したデータを取得します。

> db.books.find( )
{ "_id" : ObjectId("5280b4478be7523bdaf36ee9"), "title" : "A tiny tired article", "author" : "bibio" }

_id はドキュメント毎にユニークに設定されるIDです。システムで自動的に設定されるので勝手にかえてはいけません。

find() にJSONオブジェクトを指定すると各種クエリが実行できます。

> db.books.find({author: "bibio"})
{ "_id" : ObjectId("5280b7588be7523bdaf36eeb"), "title" : "A tiny tired article", "author" : "bibio" }
{ "_id" : ObjectId("5280b8238be7523bdaf36eec"), "title" : "Second tired article", "author" : "bibio" }

find() はカーソル(DBObject)を返します。JavaScriptオブジェクトではありません。JavaScriptオブジェクトにアクセスするには next()やforEach()メソッドなどでアクセスします。

一方、fineOne() は find() と同じですが、マッチした最初のドキュメントを返します。

> db.books.findOne({author:"bibio"})
{
"_id" : ObjectId("5280b7588be7523bdaf36eeb"),
"title" : "A tiny tired article",
"author" : "bibio"
}

find() が返すイテレータには、limitやskip, sortなどが実装されています。メソッドチェインで次の通りに呼び出すことができます。(ActiveRecordと同じかんじ)

> db.books.find().skip(10).limit(10).sort({title: -1})

上の例では、titleを降順ソート(sort)し、最初の10件を飛ばし(skip)て、10件(limit)を取得します。limit と sort の順番にかかわらず、sortした結果からlimitで指定された値を出力します。