如何从Ruby直接查询MongoDB而不是使用Mongoid?

问题描述:

我正在为使用MongoDB和Mongoid的Rails应用程序编写迁移。我的迁移目前使用我的模型,它使用Mongoid来查询和更新记录,但是性能不足。我基本上是更新大集合中的所有记录并进行n + 20个查询。我花了一个小时在本地运行后(并没有完成)杀死了迁移。我希望能够毫不费力地对mongo运行原始查询。我假设有一些方法可以从Mongoid访问一个mongo驱动程序,因为Mongoid已经加载了一个到数据库的连接。我如何访问数据库以直接运行我的更新查询?如何从Ruby直接查询MongoDB而不是使用Mongoid?

+0

上mongoid 3或2,如果二不同adapater比助力车不能记住的名字,但我想它运行'MongoDB中,红宝石driver' – Viren 2013-02-13 07:39:50

+0

是的,我使用mongoid 3 – Andrew 2013-02-13 16:36:10

如果您使用的是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 
+0

嗨安德鲁,你的答案是有用的,但我使用mongoid和直接访问您的答案中提到的集合,它工作正常,但一些如何使用这种mongoid activerecord操作后,如Model.save,Model.update_attributes等。不工作,你能为此提出一些解决方案吗? – 2014-10-29 09:55:03

+0

很难知道发生了什么,没有看到一些代码示例。我认为你应该将其作为自己的问题发布,并包含代码示例。 – Andrew 2014-10-29 15:28:45

+0

感谢Andrew的回复,但我找到了原因并解决了相同的问题。 – 2014-10-30 05:40:40

简短的回答是Moped。这是Mongoid构建的较低级别的API,如果您已经使用Mongoid,它将可用。 Moped API是原始MongoDB操作的简单包装。这里的文档:http://mongoid.org/en/moped/docs/driver.html应该是有用的。

+0

这就是我想,但我怎样才能访问它?在文档中,示例显示'Moped :: Session.new(host).use(database)',但是这个信息已经在Mongoid自动加载的配置文件中定义。我应该可以从Mongoid访问某种类型的Moped对象。我只是不知道如何。 – Andrew 2013-02-11 21:30:11

+3

你应该可以从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部分查询描述如何查询是通过轻便摩托车内部获得的内容

希望得到这个帮助

+0

有帮助,谢谢! – Andrew 2013-02-13 16:39:42

+0

被标记为答案的那个只在'rails console'中有效,但是这个可以在'Model'里面工作。我正在使用Mongoid 4.0.2。 – Charlie 2015-03-20 10:37:01

像任何人有提到这里,你的答案是助力车。 这里是我的一个Ruby脚本示例(简单文件test.rb)

  1. 定义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(五)关于收集

+0

这个命令与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