MongoDBのtypeおぼえがき

Javaでlongで宣言した値をぶちこんだら「NumberLong(1)」みたいな形でMongoDBに入ってたのでなるほどこうなるのかー程度にしか思ってなかったんですが、ふと気になってほんのちょっと調査をば。


とりあえず適当にテストデータを作ります。

> db.typetest01.save({id:1})
> db.typetest01.save({id:NumberLong(1)})
> db.typetest01.save({id:"1"})   
    
> db.typetest01.find()
{ "_id" : ObjectId("4e0b41e1c23fab52ef14942d"), "id" : 1 }
{ "_id" : ObjectId("4e0b41ebc23fab52ef14942e"), "id" : NumberLong(1) }
{ "_id" : ObjectId("4e0b41f2c23fab52ef14942f"), "id" : "1" }

うむ。
次にそれぞれの型を調べます。
typeに関しては以下を参考にします。
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24type:type


「"1"」はまあStringなので2、「NumberLong(1)」は64bitであることを考えると恐らく64-bit integerだと思われるので18だろうと予測できます。

> db.typetest01.find({id:{$type:2}})          
{ "_id" : ObjectId("4e0b41f2c23fab52ef14942f"), "id" : "1" }
> db.typetest01.find({id:{$type:18}})
{ "_id" : ObjectId("4e0b41ebc23fab52ef14942e"), "id" : NumberLong(1) }

どうやら正解のようです。


では「1」はどうなってるんでしょうか。
特に型を指定してるわけではないのでdouble?それとも32-bit integer?

> db.typetest01.find({id:{$type:1}}) 
{ "_id" : ObjectId("4e0b41e1c23fab52ef14942d"), "id" : 1 }
> db.typetest01.find({id:{$type:16}})
> 

どうやらdoubleになってるようです。
ただ、Javaからintでぶち込んでみると、mongoのコンソール上では何の違いもないように見えるのに、32-bit integer(type16)として判断されてました。
コンソールで数字ぶち込んだ場合はdoubleなんですねー。ほーん。ほーん…。


あとfindの動きもちょっと確認。

> db.typetest01.find({id:1})            
{ "_id" : ObjectId("4e0b41e1c23fab52ef14942d"), "id" : 1 }
{ "_id" : ObjectId("4e0b41ebc23fab52ef14942e"), "id" : NumberLong(1) }
> db.typetest01.find({id:NumberLong(1)})
{ "_id" : ObjectId("4e0b41e1c23fab52ef14942d"), "id" : 1 }
{ "_id" : ObjectId("4e0b41ebc23fab52ef14942e"), "id" : NumberLong(1) }
> db.typetest01.find({id:"1"})          
{ "_id" : ObjectId("4e0b41f2c23fab52ef14942f"), "id" : "1" }

うむ。なるほど。


ついでなのでちょっとtypeごとのデータサイズとか調べてみようと思ったんですがなんかいまいち分からない。
Stringだとまあ言わずもがな文字数増えればデータサイズ増えるんですが、数値だと小さくてもある程度データサイズ確保しているような感じ。
NumberLongとか入ってるからもしかしてlong値の方がStringよりデータ食うのかなとか思ったりしましたがまあそんなことはなさそうな。
数値以外が入らない保証があるなら普通に数値にしておいたほうがよさそう。
0or1とかならStringのほうがいいのかなー。うーんうーん。

スポンサーリンク