rails + mongodb 入门demo

Posted by wxianfeng Thu, 15 Jul 2010 05:49:00 GMT

NoSQL 渐渐火了起来,最近同事也在讨论这个问题,一不做,二不休,就学习了下,mongodb是采用C++写的,开源,免费,目前已经有公司(10gen)在背后提供商业支持,文件之小,windows下载二进

制包解压后是45M左右,linux下的就更小了,读写操作性能之高,即使是在大数据量,大并发的情况下,也能保持良好的性能,可以索性,例如可以结合memcached,sphinx使用,哇。。。cool。。。
这两天利用mongodb + sinatra 做了个短地址服务网址,当然只是自娱自乐一把而已,domain太ugly了,地址是 http://url.wxianfeng.com,这编来介绍

rails中使用mongodb的入门教程,是railscasts上的那篇教程,但是有许多注意点,在此重点指出。
在开始这个demo前,如果你对mongodb还不熟的话,建议先学习下mongodb,就想先学习下mysql 一样,掌握一些基本的操作过程
我的环境:windows xp + rails 2.3.5 + mongodb 1.4.4 + mongo_mapper 0.8.2

1,安装需要的gem包

gem install mongo_mapper

如果顺利的话,可以安装成功,并且包依赖的其他gem也都同时安装上了 , 例如我在美国的linode服务器上,直接执行上面命令,就安装成功了,但是在大陆无法安装成功,至少我是经过下面的安装步

骤成功的:

gem install jnunemaker-validatable --source http://gemcutter.org
gem install bson --source http://rubygems.org
gem install mongo --source http://gemcutter.org
gem install plucky --source http://gemcutter.org
gem install mongo_mapper --source http://gemcutter.org

2,新建rails工程,修改你的enviroment.rb

config.gem "mongo_mapper",:source=>"http://gemcutter.org"
config.frameworks -= [:active_record] # - 代表不加载 active_record

在这里需要注意,当你需要使用scaffold生成代码时,必须把 – 给去掉,来加载active_record,因为scaffold默认需要使用activerecord,当你开启server时,再把 – 号给加上

4,修改 database.yml

development:
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: trade_supplier_development
#  pool: 5
  username: root
  password: root
#  socket: /var/run/mysqld/mysqld.sock
  host: localhost

需要保证mysql的username,和 password正确,还是为了能使用 scaffold

5,添加 配置,在 config/initializers 下新建 mongo_config.rb

MongoMapper.database = "todo-#{Rails.env}"  

配置连接时的db name,start server时不会建立 db,当插入数据时会 同时建立 db 和 collection

6,修改Model

class Project 
  include MongoMapper::Document
  key :name, String, :required => true
  key :priority, Integer
  many :tasks 
end
class Task 
  include MongoMapper::Document
  key :project_id, ObjectId
  key :name, String
  key :completed, Boolean
  belongs_to :project
end

核心部分就是Model部分,db中的字段是根据 key来动态改变的,没有shama,没有migrate,当你添加新的key时,原有的数据不会改变,上面的两个model是1对多的关系,例如mongo——mapper 可以来

实现 1对1,1对多,多对多的关系,并且和 activerecord操作非常之相像

7,启动 mongodb
进入mongodb bin 目录下

mongod.exe --dbpath E:/mongodb/data

8,启动server

thin start

这一步会提示安装 bson_ext gem包, 我在linux中安装成功了,在windows无法顺利安装,貌似只能在UNIX中安装,需要make编译,但是只要你安装bson包,程序都可以顺利跑起来,BSON是json的binary

形式,这样会节省存储空间,最重要的是减少网络消耗

9,ok

http://localhost:3000/projects 瞧瞧

DEMO源码下载:
http://www.uushare.com/user/fl1429/file/3274129

See:
http://asciicasts.com/episodes/194-mongodb-and-mongomapper