繁体   English   中英

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

[英]How to query MongoDB directly from Ruby instead of using Mongoid?

我正在为使用MongoDB和Mongoid的Rails应用程序编写迁移。 目前,我的迁移使用的模型使用Mongoid来查询和更新记录,但性能不佳。 我实质上是在更新大集合中的所有记录并进行n + 20个查询。 我花了一个小时在本地运行(并没有完成),才杀死了迁移。 我希望能够毫不费力地对mongo运行原始查询。 我假设有某种方法可以从Mongoid访问mongo驱动程序,因为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 5:

db = Mongoid::Clients.default

collection = db[:collection_name]

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

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

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

所以如果你有模特喜欢

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查询以及如何使用助力车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应该有用。

就像任何人在这里提到的那样,您的答案是助力车。 这是我的红宝石脚本示例(简单文件test.rb)

  1. 定义一个mongoid.yml(在本例中为localhost)

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(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM