読者です 読者をやめる 読者になる 読者になる

MongoDBをさわる(DBとかコレクションとか)

前回の記事で前準備が出来たので早速DBをいじってみる。

DBをつくる

いざ!と思ったもののDBの作り方さえ分からないのでhelpさんにお願いします。

> db.help()
DB methods:
        db.addUser(username, password[, readOnly=false])
        db.auth(username, password)
        db.cloneDatabase(fromhost)
(略)

えっ。DB作成できそうなコマンドがない。
「use 」で使用するDBを変更できるっぽいのでためしに存在しないDB名を渡してみます。

> use test2
switched to db test2

お?

> show dbs
admin   (empty)
local   (empty)
test    (empty)

おお?

> db.stats()      
{
        "db" : "test2",
        "collections" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "ok" : 1
}

おおお…?

> show dbs        
admin   (empty)
local   (empty)
test    (empty)
test2   (empty)

できてる…!


useで切り替えてそのDBに対して何らかの操作をしたときに自動的に作られるみたい。
なるほど違和感。

テーブルをつくる

次はテーブルを作りたい。
調べたところMySQLとかで言うところのテーブルはコレクション、レコードはドキュメントと呼ぶらしい。
早速コレクションのhelpを!と思ったところで、先ほどDBのhelpを見たときそれっぽいのがあったのを思い出しました。

db.createCollection(name, { size : ..., capped : ..., max : ... } )

超それっぽい。
けどなんかsizeとかmaxとか指定するの気が進まないしcappedに至っては何のことかさっぱり分からない。
助けてオンラインドキュメント…!


なるほど。
とりあえずなんか今は必要ないということだけ分かった。


DBと同じように何か操作すれば作成されることを期待して、とりあえず何かinsertしてみます。
しかしやっぱりコマンドが分からないので今度はコレクションのhelpさんに助けを求めてみます。

> db.mycoll.help()
DBCollection help
        db.mycoll.find().help() - show DBCursor help
        db.mycoll.count()
        db.mycoll.dataSize()
(略)
        db.mycoll.save(obj)

db.mycoll.save(obj)…それっぽい…。
けどobjって何だ…。どう入れればいいんだ…。しにたい…。
やはり頼みの綱はドキュメント。


すてき!
JSONに似たBSONという形式で渡してやればよいみたい。
そうと分かれば早速実行…!

> db.table01.save({seq:1,text:"test1"});
> db.table01.find();
{ "_id" : ObjectId("4db90d62d4f62aaa740c8d43"), "seq" : 1, "text" : "test1" }

はいったー。


スキーマレスということで好き放題やってみる。

> db.table01.save({seq:2,text:"test2",array:[0,1,2]});
> db.table01.save({seq:3,text:"test2",insDatetime:new Timestamp()});
> db.table01.save({seq:2,text:"test2",array2:[{"x":0},{"y":1},{"z":2}]});
> db.table01.find();                                                     
{ "_id" : ObjectId("4db90d62d4f62aaa740c8d43"), "seq" : 1, "text" : "test1" }
{ "_id" : ObjectId("4db90f58bda403cc100f763a"), "seq" : 2, "text" : "test2", "array" : [ 0, 1, 2 ] }
{ "_id" : ObjectId("4db90f7ebda403cc100f763b"), "seq" : 3, "text" : "test2", "insDatetime" : { "t" : 0, "i" : 0 } }
{ "_id" : ObjectId("4db9106bbda403cc100f763c"), "seq" : 2, "text" : "test2", "array2" : [ { "x" : 0 }, { "y" : 1 }, { "z" : 2 } ] }

おお…。
配列も連想配列も、あるんだよ。すてきですね。


よく見たらコマンドコピーしたせいでseqとかtextとか被ったりしてる。はずい。アップデートしたい。

db.collection.update( criteria, objNew, upsert, multi )

これでいけるらしい。
とりあえず3つ目のドキュメントのtextの値を修正します。

> db.table01.update({_id: ObjectId("4db90f7ebda403cc100f763b")},{$set:{text:"text3"}}); 
> db.table01.find({_id:ObjectId("4db90f7ebda403cc100f763b")});
{ "_id" : ObjectId("4db90f7ebda403cc100f763b"), "seq" : 3, "text" : "text3", "insDatetime" : { "t" : 0, "i" : 0 } }

でけた!


次に4つ目のドキュメントのseqを修正します。
折角なのでなんかインクリメントする関数的なやつを使ってみます。

> db.table01.update({_id: ObjectId("4db9106bbda403cc100f763c")},{$inc:{seq:2}});
> db.table01.find({_id:ObjectId("4db9106bbda403cc100f763c")});                  
{ "_id" : ObjectId("4db9106bbda403cc100f763c"), "seq" : 4, "text" : "test2", "array2" : [ { "x" : 0 }, { "y" : 1 }, { "z" : 2 } ] }

でけた!


findするたび目に付いた_idは明示的に指定しないと自動的に入るみたい。


とりあえず今回はここまで。

スポンサーリンク