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



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

如果您使用的是Mongoid 3,它可以轻松访问其MongoDB驱动程序:Moped。以下是访问一些原始数据而不使用Models访问数据的示例:

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 5:

db = Mongoid::Clients.default
collection = db[:collection_name]

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

以下是您的操作方法(这也适用于2+和3+)

1) 您的所有模型都表现出这种行为,在所有模型中都包含Mongoid::Document,因此从技术上讲,每个文档都通过moped或Mongoid 映射到mongodb ruby驱动程序中

所以如果你有这样的型号

class PerformerSource 
  include Mongoid::Document
  ## Definition
end

现在,您可以使用类似以下的驱动程序(Moped或Mongodb-ruby驱动程序)运行MongoQuery

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如何映射那些使用轻便摩托车u的人可以遵循本节的查询,其中描述了如何通过轻便摩托车内部实现查询

希望这能帮助

对于Mongoid 6:

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

简短的答案是Moped。这是Mongoid构建的底层API,如果您已经使用Mongoid,它将可用。Moped API是一个围绕原始MongoDB操作的精简包装器。此处的文档:http://mongoid.org/en/moped/docs/driver.html应该是有用的。

就像这里提到的任何人一样,你的答案是Moped。下面是我的ruby脚本(simplefiletest.rb)示例

  1. 定义mongoid.yml(在本例中,位于localhost)
development:
  sessions:
    default:
      database: test_development
      hosts:
        - localhost:27017
      options:
  1. 设置负载配置和测试集合

    #/usr/bin/env-ruby需要"mongoid"

    Mongoid.load!("path/to/file/mongoid.yml",:development)#:developmence对应于mongoid.yml的第一行环境db=Mongoid::Sessions.defect看跌期权;收款单据数:>{db[:collection].find.count}";

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

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

其中的诀窍是BSON::ObjectID。如果你想搜索一个id,这就像在mongo查询中一样。

db.items.update({ '_id': ObjectId("55512b7070722d22d3050000") }, { $set: {'category_name': 'Test' } })

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

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

最新更新