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

时间:2013-02-11 16:55:02

标签: ruby-on-rails mongodb mongoid

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

7 个答案:

答案 0 :(得分:33)

如果您正在使用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

答案 1 :(得分:8)

对于Mongoid 5:

db = Mongoid::Clients.default

collection = db[:collection_name]

现在我们可以对集合执行查询

答案 2 :(得分:6)

在这里你是如何做到的(这也适用于2+和3+)

1)所有模型都展示了这种行为,你在所有模型中都有包含Mongoid :: Document ,所以从技术上讲,每个文档都通过mongoid映射到monogodb到moped或mongodb-ruby驱动程序

所以如果您有型号赞

class PerformerSource 
  include Mongoid::Document
  ## Definition

end

现在你可以使用像这样的驱动程序(Moped或Mongodb-ruby驱动程序)运行Mongo Query

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")

如何更多关于mongo查询以及mongoid如何映射那些使用轻便摩托车的人可以按照this部分查询描述如何通过轻便摩托车在内部实现查询

希望这个帮助

答案 3 :(得分:1)

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

答案 4 :(得分:1)

像任何人在这里提到的,你的答案是轻便摩托车。 这是我的ruby脚本示例(简单文件test.rb)

  1. 定义mongoid.yml(在本例中为localhost)
  2. 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}"
    

答案 5 :(得分:1)

对于Mongoid 6:

db = Mongoid::default_client
collection = db[:collection_name]

答案 6 :(得分:0)

如果您使用mongoid 5(五)我会建议使用它。

{

import java.util.Scanner;

import java.io.File;

import java.io.FileNotFoundException;

public class FileAccess {

    private static String fileName = "ingredients";

    private static Scanner inputStream = null;

}

}

这方面的技巧是BSON :: ObjectID。如果您要搜索单个ID,这就像在mongo查询中一样。

Item.collection.update_one({_id:  BSON::ObjectId('55512b7070722d22d3050000')}, '$set' => { 'category_name': 'Test' })

以上是查询的mongo版本。我发现将ruby代码转换为mongo代码是很难的部分,因为在文档中有一些部分可能有点难以找到。

http://www.rubydoc.info/gems/mongo/Mongo%2FCollection%3Aupdate_one