我正在考虑在一个新项目上使用mongodb,但在钻研之前,我想知道它是否支持一些关键功能.我知道您不需要迁移,并且您可以添加嵌入对象,但是所有这些意味着它的行为就像'accepts_nested_attributes_for'方法总是在那里一样?
您是否知道我应该注意的任何其他杀手功能会影响我或者反对MongoDB?
这是我最近发现的一篇文章,其他人也可能对以下内容感兴趣:
是否可以将AR与MongoMapper/MongoID结合起来?
如果是这样,是否有教程/文件?
这只是我周末的项目/研究,我是Sinatra和MongoDB的新手.
我已经为mongoDB安装了宝石,例如:mongo,mongo_mapper和mongoid.
当我尝试从localhost连接到MongoHQ上的数据库时,遇到了这样的错误:
Mongo::ConnectionFailure at /
failed to connect to any given host:port
* file: connection.rb
* location: connect
* line: 489
Run Code Online (Sandbox Code Playgroud)
我在SO上找到了类似的帖子,但坦率地说,我不太明白答案......
这是我的代码片段:
require 'rubygems'
require 'sinatra'
require 'mongo'
require 'mongo_mapper'
get '/' do
MongoMapper.connection = Mongo::Connection.new('flame.mongohq.com', 27044)
MongoMapper.database = 'notes'
MongoMapper.database.authenticate('foo', 'bar')
erb :list
end
Run Code Online (Sandbox Code Playgroud)
我从这里拿了上面的代码,但似乎没有用......
哪部分错了?还有另一种方法吗?最后,这个测试Web应用程序将部署到heroku上,所以我希望该解决方案可以同时使用localhost和我的heroku服务器.
更新:
I just created a minimal code snippet to test the mongodb connection:
require 'rubygems'
require 'mongo'
db = Mongo::Connection.new("flame.mongohq.com", 27044).db("notes")
Run Code Online (Sandbox Code Playgroud)
但是在超时后仍然出现错误:
$ ruby mongodbtest.rb …Run Code Online (Sandbox Code Playgroud) 我有我的Yaml配置文件,mongo.yml:
development:
adapter: mongodb
database: fhsclock_development
host: localhost
port: nil
test:
adapter: mongodb
database: fhsclock_test
host: localhost
port: nil
production:
adapter: mongodb
database: fhsclock
hosts:
- - localhost
- nil
- - staff.mongohq.com
- 10015
Run Code Online (Sandbox Code Playgroud)
如何使用此文件进行MongoMapper的配置和连接?
我们使用的是mongodb 2.0.0,mongo gem 1.4.1,mongo_mapper 0.9.2,rails 3.0.6.
我们喜欢MongoMapper,但我们需要帮助解决一个令人讨厌的问题:我们从一些测试中得到了一个密钥,但调用obj.unset却无法做任何事情.
具体来说,我们试图删除一个"id"键(不是"_id"),因为它导致MM将obj.id视为与我们不想要的obj._id不同.
清理完数据库之后,我们从一个不执行任何操作的控制器运行这些命令:(我们也尝试从rails控制台运行相同的代码,但它也失败了.)
logger.info "#{Game.keys.keys.inspect}"
Game.unset({}, :id)
logger.info "#{Game.keys.keys.inspect}"
Game.unset(:id)
logger.info "#{Game.keys.keys.inspect}"
Run Code Online (Sandbox Code Playgroud)
输出:
["jackpot", "players", "created_at", "puzzles", "ended_at", "player_index", "updated_at", "log", "_id", "id", "join_code", "puzzle_index"]
["jackpot", "players", "created_at", "puzzles", "ended_at", "player_index", "updated_at", "log", "_id", "id", "join_code", "puzzle_index"]
["jackpot", "players", "created_at", "puzzles", "ended_at", "player_index", "updated_at", "log", "_id", "id", "join_code", "puzzle_index"]
Run Code Online (Sandbox Code Playgroud)
我们的游戏模型中定义的当前键:
key :players, Array, :default => []
key :player_index, Integer, :default => 0
key :puzzles, Array, :default => []
key :puzzle_index, Integer, :default => 0 …Run Code Online (Sandbox Code Playgroud) 我需要编写一个查询,查找在指定日期创建的所有文档.
我们假设日期是今天.
我试过这个:
Document.all(:created_at => Date.parse(Time.now.strftime('%Y/%m/%d')))
Run Code Online (Sandbox Code Playgroud)
但我得到了:
无法将类Date的对象序列化为BSON.
谢谢你的帮助.
更新 此链接说明了如何使用MongoMapper进行日期范围查询.
Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )
Run Code Online (Sandbox Code Playgroud) 我正在运行以下查询,返回结果平均需要9秒.它上面没有过滤器,所以我不确定索引是否会有所帮助.为什么这么慢?那里只有250个对象,只有4个字段(全部是文本).
Country.collection.find({},:fields => ['country_name', 'country_code']).to_json
"cursor":"BasicCursor",
"nscanned":247,
"nscannedObjects":247,
"n":247,
"millis":0,
"nYields":0,
"nChunkSkips":0,
"isMultiKey":false,
"indexOnly":false,
"indexBounds":{},
"allPlans":[{"cursor":"BasicCursor","indexBounds":{}}]
Run Code Online (Sandbox Code Playgroud)
机器上的cpu,内存和磁盘甚至都没有注意到查询运行.任何帮助,将不胜感激.
我正在使用Tire和elasticsearch在MongoMapper模型上提供搜索功能,这是Rails应用程序的一部分.我只是偶然发现了一个问题,当我重新部署到使用以下配置的环境(在config/environments/env_name.rb中)时,此模型的映射没有更新:
config.cache_classes = true
Run Code Online (Sandbox Code Playgroud)
单独重新加载类似乎没有解决问题(也许可以理解,新的映射可能与我猜的现有数据不兼容?).相反,我必须做以下事情:
MyModel.index.delete
<restart the app or reload the class>
MyModel.index.import MyModel.all
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更好的方法a).确保我的模型代码中定义的最新映射在每次部署后由elasticsearch使用,但b).避免用完整的数据集重新填充索引?
我们通常使用Chef进行部署,因此我可以自动完成我成功使用的三个步骤而不会有太多麻烦.但我是弹性研究的新手,所以我认为我很可能会误用两者或者让事情变得不必要.
mongomapper ×10
mongodb ×8
ruby ×4
chef-infra ×1
doctrine-odm ×1
doctrine-orm ×1
heroku ×1
mongoid ×1
nosql ×1
postgresql ×1
sinatra ×1
tire ×1
yaml ×1