mongorilla
mongorilla is very small Object Document Mapper for mongo. mongorilla can update atomic with condition. mongorilla accept single server or Master/Slave or Replica Set mongorilla does not manage relation. but you can create relation without difficulty. see mongorilla apli using relation github.com/takeshy/bookshelf-with-mongorilla
sample
Mongorilla::Collection.build("/var/www/mongo_config.yml") #only one time when boot
class User
UserFields = [:_id,:name,:password,:logs,:log_count]
include Mongorilla::Document
end
user = User.create(:name => "morita",:password => "pass")
u = User.find(user.id) # find by id
u = User.find({:name => "morita"},:master=>true)[0] #find user named morita for master db (if you want avoid slave time lag)
u.password = "hello" #change attribute whithout update db yet
u.push("logs","ooooo") #$push whithout update db yet
u.inc("log_count",1) #$inc whithout update db yet
u.save #update above change to db
u.push("logs","bb") #$push whithout update db yet
u.push("logs","cc") #$push whithout update db yet
p u.logs # ["ooooo","bb","cc"]
p u.password # "hello"
p u["password"] # "hello"
u.inc("log_count",2) #$inc +2 whithout update db yet
p u.log_count # 3
ret = u.save({:log_count => {"$lt" => 1}},Mongorilla::Document::SYNC) #update failed because log_count was 1.
p ret # false
p u.logs # ["ooooo"]
p u.log_count # 1
u.pull("logs","ooooo") #$pull whithout update db yet
p u.logs #["ooooo"] $pull is not reflect object because pull can be complex when embedded or $gt etc.
ret = u.save(Mongorilla::Document::RELOAD) #update success and reflect object because reload was specified.
p ret #true
p user.logs # []
config
#single server
host: localhost
port: 27017
database: dev
#Master/Slave
host: localhost
port: 27017
database: dev
slaves:
- host: localhost
port: 27018
#replica Set
hosts
- - localhost
- 27017
- - localhost
- 27018
database: dev
syntax
1. Connect Server below statement when boot application
Mongorilla::Collection.build("/var/www/mongo_config.yml",Logger.new("logfile.log"))
logger is option. if logger does not exist,Mongorilla does not output log.
2. create document class and define constant class name + Fields with document fields and include Mongorilla::Document.
class Class
ClassNameFields = [:_id,...]
include Mongorilla::Document
end
Class.create(attributes)
args:
attributes hash for document
description:
set attributes to db and return new Object
Class.collection
description:
get mongodb collection
Class.find_one(cond,opt)
args:
cond condition {:logcount => {"$gt" => 2}} etc.
opt option master => true then find master db other option see mongo driver {:master => true,:fields => [:name]} etc.
description:
find one match object. if not exitst,return nil
Class.find(cond,opt)
args:
cond condition {:logcount => {"$gt" => 2}} etc. if cond is String or BSON::ObjectId then search _id and return one object.
opt option master => true then find master db other option see mongo driver {:master => true,:fields => [:name]} etc.
description:
return match objects array. if not exitst,return nil
#set(k,v)
args:
k field name for $set
v value for $set
description:
modify object attribute and modify @change for save. this method does not reflect db.
#inc(k,v)
args:
k field name for $inc
v amount for $inc. it is possible less than 0.
description:
modify object attribute and modify @change for save. this method does not reflect db.
#push(k,v)
args:
k field name for $push
v value for $push
description:
modify object attribute and modify @change for save. this method does not reflect db.
#unset(k)
args:
k field name for $unset
description:
modify object attribute and modify @change for save. this method does not reflect db.
#push_all(k,v)
args:
k field name for $pushAll
v value for $pushAll
description:
modify object attribute and modify @change for save. this method does not reflect db.
#add_to_set(k,v)
args:
k field name for $addToSet
v value for $addToSet
description:
modify object attribute and modify @change for save. this method does not reflect db.
#pop(k,v)
args:
k field name for $pop
v value if less than 0 remove first else remove tail
description:
modify object attribute and modify @change for save. this method does not reflect db.
#pull(k,v)
args:
k field name for $pull
v value for $pull
description:
modify @change for save. this method does not reflect object and db.
#pull_all(k,v)
args:
k field name for $pullAll
v value for $pullAll
description:
modify @change for save. this method does not reflect object and db.
#save(cond,opt,mode)
args:
cond condition(optional) {:count => {$lt => 20}} etc.
opt option(optional) see mongdb driver {:upsert => true} etc.
mode Mongorilla::Document::SYNC(default) or Mongorilla::Document::ASYNC or Mongorilla::Document::RELOAD
SYNC is specified,check result,RELOAD is specified,check result and fetch update record from db,
ASYNC is specified,does not check result.
description:
reflect @change to DB
#delete
description:
remove object from db
#reset
description:
discard @changes and reset object to original
#reload
description:
fetch record from db.
Contributing to mongorilla
-
Check out the latest master to make sure the feature hasn’t been implemented or the bug hasn’t been fixed yet
-
Check out the issue tracker to make sure someone already hasn’t requested it and/or contributed it
-
Fork the project
-
Start a feature/bugfix branch
-
Commit and push until you are happy with your contribution
-
Make sure to add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
Copyright
Copyright © 2011 Takeshi Morita. See LICENSE.txt for further details.