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

Shoken Startup Blog

KitchHikeを作っています。ひとつずつアウトプットします。

MongoDBへ様々なデータ型を保存/取得してみる。Boolean編

MongoDB Ruby

MongoDBへ様々なデータ型を保存/取得してみる。オブジェクトマッピング編 - オープンソースよしみ視点
MongoDBへ様々なデータ型を保存/取得してみる。バイナリ(BINARY)編 - オープンソースよしみ視点
の続きです。

今回はMongoDBのBoolean型についてです。

Mongo ShellからMongoDBのBoolean型の操作

Boolean型として保存するには、true/falseを使います。
注意点としては、true/falseを'(シングルクォート)で囲まないことです。
Type Numberで検索することで、どのデータ型で保存されているかを確認できます。

[root@xxx ~]# mongo --quiet
> typeof(true)                                                 # typeof(Boolean(1))もboolean trueを返す
boolean
> typeof(false)                                                # typeof(Boolean(0))もboolean falseを返す
boolean
> db.boolean_test.insert({x:true})                             # Boolean型としてinsert
> db.boolean_test.find({x:{$type:8}})                          # key=xのvalueがBoolean型のものを検索
{ "_id" : ObjectId("4f8541e908b824ae767885e0") }               # ヒットする
> db.boolean_test2.insert({y:'true'})                          # ''で囲むとString型としてinsertされる
> db.boolean_test2.find({y:{$type:8}})                         # ヒットせず
> db.boolean_test2.find({y:{$type:2}})                         # key=yのvalueがString型のものを検索
{ "_id" : ObjectId("4f85456de04dd3c94a0647e6"), "y" : "true" } # ヒットする

RubyからMongoDBのBoolean型の操作

RubyからはTrueClass、FalseClassを使用します。

require 'gmail'
require 'mongo'

db_name='test'   #MongoDBのデータベース名
coll_name='boolean_test_ruby' # MongoDBのコレクション名

## 接続処理
db = Mongo::Connection.new.db(db_name)
coll = db.collection(coll_name)

## データをinsert
## TrueClassのインスタンスであるtrueオブジェクトを使う
## http://doc.ruby-lang.org/ja/1.9.3/class/TrueClass.html
coll.insert({:x => true}) #Boolean型が入る

## FalseClassのインスタンスであるfalseオブジェクトを使う
## http://doc.ruby-lang.org/ja/1.9.3/class/FalseClass.html
coll.insert({:x => false}) #Boolean型が入る

coll.insert({:x => 'true'}) #String型が入る
coll.insert({:x => 'false'}) #String型が入る

## データを取得
db[coll_name].find().each{ |doc|
  p doc['x'].class
}

db.connection.close

出力はこうなります。

[root@xxx ~]# ruby mongo_boolean.rb
TrueClass    # coll.insert({:x => true})
FalseClass   # coll.insert({:x => false})
String       # coll.insert({:x => 'true'})
String       # coll.insert({:x => 'false'})

MongoDBから確認

[root@xxx ~]# mongo --quiet
> db.boolean_test_ruby.find()
{ "_id" : ObjectId("4f854a393e91d83c08000002"), "x" : true }
{ "_id" : ObjectId("4f854a393e91d83c08000003"), "x" : false }
{ "_id" : ObjectId("4f854b1a3e91d83cc1000001"), "x" : "true" }
{ "_id" : ObjectId("4f854b1a3e91d83cc1000002"), "x" : "false" }