mongo単体で使ってみててだいたい分かったので、mongoidというmapperを使ってみる。

mongoidの良いのは

  • default値を入れておきたい場合も簡単に書ける。created_atとか。
  • _idでdocumentを取り出すとき、素のmongoだとcollection.find_one(BSON::ObjectID(id))とかしないとならないけどmongoidだと_idに文字列でID入れればいい
とかがぱっと使ってみて思った。。
そもそもこういうのmongoの機能にあるかもしれないけど。

■ドキュメント
■インストール
sudo gem install mongoid
1.9.1を使う。–pre付けるとRails3対応の2.x系統が入る。

■modelを作る
適当にperson class作って、Mongoid::Documentにする

person.rb
require 'rubygems'

class Person
include Mongoid::Document
field :fullname # 指定無しでtype=>stringになる
field :username
field :age, :type => Integer
field :created_at, :type => DateTime, :default => lambda{Time.now}
end
string以外は型指定する。型はArray, BigDecimal, Boolean, Date, DateTime, Float, Integer, String, Symbol, Timeがある。
Mongoid Documentation: Documents

defaultで現在時刻を入れるようにした。

■mongodbへ接続
Mongoid.configureのブロック内で接続する。
conf.masterに普通のmongoで接続してdbを指定した時の返り値(Mongo::DBオブジェクト)を与えれば、mongoidで使える。
require 'rubygems'
require 'mongoid'
require File.dirname(__FILE__)+'/person'

Mongoid.configure do |conf|
  conf.master = Mongo::Connection.new('localhost', 27017).db('mongoid-test')
end
■modelの操作
新しいpersonオブジェクト作って保存
person = Person.new(:fullname => 'sho hashimoto',
:username => 'shokai',
:age => 25)

puts person.fullname
puts person.age

person.save
保存されてるか、mongoのコンソールで確かめる
personで保存したら、自動的に複数形のpeopleになってた。ActiveRecordっぽい。
% mongo
MongoDB shell version: 1.4.4
url: test
connecting to: test
type "help" for help
> show dbs
admin
chirpstream_shokai
local
mongoid-test
people
povietest
test
testdb
> use mongoid-test
switched to db mongoid-test
> show collections
people
system.indexes
> db.people.find()
{ "_id" : "4c61463c2f7306e9fe000001", "created_at" : "Tue Aug 10 2010 21:29:48 GMT+0900 (JST)", "fullname" : "sho hashimoto", "username" : "shokai", "age" : 25 }
{ "_id" : "4c614d652f73060653000001", "created_at" : "Tue Aug 10 2010 22:00:21 GMT+0900 (JST)", "fullname" : "sho hashimoto", "username" : "shokai", "age" : 25 }
2回保存したから複数保存されてた

■find
探す。Mongoid Documentation: Queryingにqueryの書き方が載ってる。
適当にユーザ名shokaiの最初の一件を取得して、表示する
person = Person.first(:conditions => {:username => 'shokai'})
puts person._id
puts person.username
puts person.created_at
他にも、全件とか色々な書き方ができる。
person = Person.find(:first, :conditions => {:username => 'shokai'})
person = Person.all(:conditions => {:username => 'shokai'}).first
person = Person.first(:conditions => {:_id => '4c61463c2f7306e9fe000001'})
person = Person.where(:username => 'shokai').first
allで検索したら結果が1件しか無くても、collectionで返ってくる。eachで回せる。

■modelに書いてない値を入れてみる
modelにない、person.placeを入れてみる
person = Person.new(:fullname => 'sho hashimoto',
:username => 'shokai',
:age => 25,
:place => 'fujisawa')

puts person.fullname
puts person.age
puts person.place

person.save
普通に入ってた。このへんは複数人でやるときは何か考えないとならないな。
でもクロールしてきた値とかを適当にどんどん入れてしまうのにはすごくいい。twitterのchirp streamとか。

数値はlt,gtで大なり小なり条件指定できるらしい。
あとmongodbは空間型があるはずだけどそれは使えないのかな?filedの型になかったけど。