我正在使用Ruby on Rails开始一个业余爱好(非收入)项目.我使用Postgresql在Rails中做了大量的开发,我可以很好地模仿规范化的模式.然而,Mongrodb看起来有光泽和新颖.尝试新的东西比业余爱好项目更好吗?
回想一下您何时开始使用Mongodb.你后来学到了什么技巧让你说:"我开始的时候才知道这一点!" 如果只有你知道的话,你发现你从一开始就使用了哪些插件?你想要什么参考书签?
我已经尝试了MongoMapper,它功能齐全(提供几乎所有AR功能),但我对使用大型数据集时的性能不是很满意.有没有人比较Mongoid?任何性能提升?
我正在构建一个使用MongoDB作为后端的Rails应用程序,使用MongoMapper作为ORM工具.假设在版本1中,我定义了以下模型:
class SomeModel
include MongoMapper::Document
key :some_key, String
end
Run Code Online (Sandbox Code Playgroud)
稍后在版本2中,我意识到我需要在模型上使用新的必需键.因此,在版本2中,SomeModel现在看起来像这样:
class SomeModel
include MongoMapper::Document
key :some_key, String
key :some_new_key, String, :required => true
end
Run Code Online (Sandbox Code Playgroud)
如何迁移所有现有数据以包含some_new_key?假设我知道如何为所有现有文档设置合理的默认值.更进一步,假设在版本3中,我意识到我根本不需要some_key.所以,现在模型看起来像这样
class SomeModel
include MongoMapper::Document
key :some_new_key, String, :required => true
end
Run Code Online (Sandbox Code Playgroud)
但是我的数据库中的所有现有记录都为some_key设置了值,而这只是浪费空间.我该如何收回那个空间?
使用ActiveRecord,我刚刚创建了迁移来添加some_new_key的初始值(在version1 - > version2迁移中)并删除some_key的值(在version2 - > version3迁移中).
使用MongoDB/MongoMapper执行此操作的适当方法是什么?在我看来,仍然需要一些跟踪哪些迁移的方法.这样的事情存在吗?
编辑:我认为人们忽略了我的问题.有时您希望能够在数据库上运行脚本来更改或重构其中的数据.我在上面给出了两个示例,一个是添加了新的必需密钥,另一个是可以删除密钥并且可以回收空间的示例.如何管理运行这些脚本?ActiveRecord迁移为您提供了一种简单的方法来运行这些脚本并确定已运行的脚本以及尚未运行的脚本.我显然可以编写一个Mongo脚本来对数据库进行任何更新,但我正在寻找的是一个像迁移这样的框架,可以跟踪哪些升级脚本已经运行过.
我正在考虑将MongoDB(mongo-mapper)用于我的rails应用程序的一部分.我还没准备好全力以赴MongoDB,因为有太多有用的宝石依赖于传统的数据库.
话虽如此,我的应用程序的某些部分可以很好地利用文档数据库.
有没有人成功混合这两种方法?如何将activerecord模型与mongomapper模型相关联?
gem 'rails', '3.0.0'
gem 'devise'
gem 'bson_ext', '>= 1.0.7'
gem 'bson', '>= 1.0.7'
gem 'mongo_mapper', :branch => 'rails3', :git => 'http://github.com/jnunemaker/mongomapper.git'
gem 'devise-mongo_mapper', :git => 'git://github.com/collectiveidea/devise-mongo_mapper'
Run Code Online (Sandbox Code Playgroud)
通过上面的设置,我在请求时收到以下错误:
Started GET "/users/sign_out" for 127.0.0.1 at 2010-09-27 13:16:30 +0300
Processing by Devise::SessionsController#destroy as HTML
Redirected to http://localhost:3000/
Completed 302 Found in 19ms
[2010-09-27 13:16:31] ERROR Errno::ECONNRESET: Connection reset by peer
/usr/local/ruby/lib/ruby/1.9.1/webrick/httpserver.rb:56:in `eof?'
/usr/local/ruby/lib/ruby/1.9.1/webrick/httpserver.rb:56:in `run'
/usr/local/ruby/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'
Started GET "/users/edit" for 127.0.0.1 at 2010-09-27 13:16:35 +0300
Processing by Devise::RegistrationsController#edit as HTML
Completed …Run Code Online (Sandbox Code Playgroud) 我从远程站点获取多个类似的JSON对象,并希望将它们存储在本地MongoDB中.
最好的方法是什么?(最好通过Mongoid或Mongo-mapper宝石)
谢谢
我如何获得数组中的第一个元素并将其返回到Mongo聚合中?
我尝试在mongo中运行此代码,但失败:
db.my_collection.aggregate([
{ $project: {
resp : { my_field: { $slice: 1 } }
}}
])
Run Code Online (Sandbox Code Playgroud)
OBS:'my_field'是一个有4个位置的数组,我需要它只返回第一个元素.
返回:
uncaught exception: aggregate failed: {
"errmsg" : "exception: invalid operator '$slice'",
"code" : 15999,
"ok" : 0
}
Run Code Online (Sandbox Code Playgroud) 我想为Devise编写一个扩展,允许您使用parse_resource作为数据存储区(而不是ActiveRecord).parse_resource是Parse.com的REST api的Ruby包装器.它的界面与ActiveRecord几乎相同,并且是ActiveModel投诉.因此,Devise的扩展似乎可能不需要太多的非样板.
但是,我找不到任何教程.我所依赖的只是其他扩展的来源.从MongoMapper扩展,我认为有两个主要部分:
发电机(不是很需要)
在这里你覆盖DeviseGenerator#(generate_model|inject_devise_content|replace_default_devise_orm)方法.
"胆量 "(非常需要)
我不太确定这里发生了什么.似乎有很多样板,有一些自定义类型转换,在底部有一个声明,我们将使用此扩展而不是默认的ORM.
这就是它的全部吗?我错过了什么?有人可以更详细地解释"胆量"中发生的事情吗?
是否有任何简单的lint测试可以确保与Devise完全兼容?
我开始认为我想要做的下一个项目可以更好地使用NoSQL解决方案.该项目要么涉及大量的2列表,要么涉及传统SQL数据库中动态生成列的大量动态查询.所以我觉得NoSQL数据库会更清洁.
我正在看MongoDB,看起来很有前途.无论如何,我试图理解这一切.另外,我将在Ruby中使用MongoMapper.
无论如何,我很困惑如何在这样一个自由形式的数据库中布局东西.我已经阅读过NoSQL最佳实践,其中的答案是NoSQL DB中的规范化通常很糟糕.那么如何用最好的方式说出一个包含用户,帖子和评论的简单博客?
我的自然想法是每个都有三个集合,然后通过一个唯一的ID链接它们.但这显然是错的?那么,有什么方法可以列出这样的东西呢?我对另一个问题中给出的答案的关注是,如果作者的名字改变了怎么办?您必须更新大量的帖子和评论.但这对NoSQL来说是否可以呢?
mongomapper ×10
mongodb ×8
ruby ×4
mongoid ×3
devise ×2
activerecord ×1
migration ×1
nosql ×1
odm ×1