如何从Ruby直接查询MongoDB而不是使用Mongoid?
我正在为使用MongoDB和Mongoid的Rails应用程序编写迁移。我的迁移目前使用我的模型,它使用Mongoid来查询和更新记录,但是性能不足。我基本上是更新大集合中的所有记录并进行n + 20个查询。我花了一个小时在本地运行后(并没有完成)杀死了迁移。我希望能够毫不费力地对mongo运行原始查询。我假设有一些方法可以从Mongoid访问一个mongo驱动程序,因为Mongoid已经加载了一个到数据库的连接。我如何访问数据库以直接运行我的更新查询?如何从Ruby直接查询MongoDB而不是使用Mongoid?
如果您使用的是Mongoid 3,则可以轻松访问其MongoDB驱动程序:Moped。下面是一些访问原始数据,而无需使用模型来访问数据的例子:
db = Mongoid::Sessions.default
# inserting a new document
collection = db[:collection_name]
collection.insert(name: 'my new document')
# finding a document
doc = collection.find(name: 'my new document').first
# iterating over all documents in a collection
collection.find.each do |document|
puts document.inspect
end
嗨安德鲁,你的答案是有用的,但我使用mongoid和直接访问您的答案中提到的集合,它工作正常,但一些如何使用这种mongoid activerecord操作后,如Model.save,Model.update_attributes等。不工作,你能为此提出一些解决方案吗? – 2014-10-29 09:55:03
很难知道发生了什么,没有看到一些代码示例。我认为你应该将其作为自己的问题发布,并包含代码示例。 – Andrew 2014-10-29 15:28:45
感谢Andrew的回复,但我找到了原因并解决了相同的问题。 – 2014-10-30 05:40:40
简短的回答是Moped。这是Mongoid构建的较低级别的API,如果您已经使用Mongoid,它将可用。 Moped API是原始MongoDB操作的简单包装。这里的文档:http://mongoid.org/en/moped/docs/driver.html应该是有用的。
这就是我想,但我怎样才能访问它?在文档中,示例显示'Moped :: Session.new(host).use(database)',但是这个信息已经在Mongoid自动加载的配置文件中定义。我应该可以从Mongoid访问某种类型的Moped对象。我只是不知道如何。 – Andrew 2013-02-11 21:30:11
你应该可以从Mongoid中获得它:'Mongoid :: Sessions.default'将返回一个'Moped :: Session',你可以从中执行所有Moped的东西。 – 2013-02-11 22:54:21
在这里,您如何做到这一点(这将工作2+和3+以及)
1)你的所有型号出现此行为你有包括Mongoid ::您所有的模型内部文件所以在技术上各文档在monogodb通轻便摩托车或MongoDB中,红宝石驱动器通过mongoid映射
所以如果你有模型像
class PerformerSource
include Mongoid::Document
## Definition
end
现在你可以使用的驱动程序(轻便摩托车或MongoDB中,红宝石驱动程序)运行一样蒙戈查询这
PerformerSource.collection.insert("something")
## where something is json document you want to insert
这作罢助力车(如果使用mongoid 3)该文档
2连接),你也可以像下面这样做
Mongoid::Sessions.default.collections.find { |document| document.name == "performer_sources"}.insert("something")
东西如何更上蒙戈查询和如何mongoid映射那些使用助力车ü可以按照this部分查询描述如何查询是通过轻便摩托车内部获得的内容
希望得到这个帮助
像任何人有提到这里,你的答案是助力车。 这里是我的一个Ruby脚本示例(简单文件test.rb)
- 定义mongoid.yml(在这种情况下,在本地主机)
development: sessions: default: database: test_development hosts: - localhost:27017 options:
2。设置负载配置和测试集
#!/usr/bin/env ruby
require 'mongoid'
Mongoid.load!("path/to/file/mongoid.yml",:development) # :development corresponds to mongoid.yml first line environment
db = Mongoid::Sessions.default
puts "Collection documents count :> #{db[:collection].find.count}"
对于Mongoid 5:
db = Mongoid::Clients.default
collection = db[:collection_name]
现在我们如果您在使用mongoid 5(五)关于收集
这个命令与mongoid 5.1 – Brandt 2017-04-19 17:46:45
执行查询,我会建议使用此。
Item.collection.update_one({_id: BSON::ObjectId('55512b7070722d22d3050000')}, '$set' => { 'category_name': 'Test' })
这个技巧是BSON :: ObjectID。这就像在mongo查询中一样,如果你想搜索一个单一的ID。
db.items.update({ '_id': ObjectId("55512b7070722d22d3050000") }, { $set: {'category_name': 'Test' } })
以上是查询的mongo版本。我发现将ruby代码翻译成mongo代码是很难的部分,因为在文档中有几件难以找到。
http://www.rubydoc.info/gems/mongo/Mongo%2FCollection%3Aupdate_one
上mongoid 3或2,如果二不同adapater比助力车不能记住的名字,但我想它运行'MongoDB中,红宝石driver' – Viren 2013-02-13 07:39:50
是的,我使用mongoid 3 – Andrew 2013-02-13 16:36:10