我正在为使用 MongoDB 和 Mongoid 的 Rails 应用程序编写迁移。我的迁移目前使用我的模型,这些模型使用 Mongoid 来查询和更新记录,但性能低于标准。我本质上是在更新大型集合中的所有记录并进行 n+20 次查询。我花了一个小时在本地运行(但没有完成)后终止了迁移。我希望能够毫不费力地对 mongo 运行原始查询。我假设有一些方法可以从 Mongoid 访问 mongo 驱动程序,因为 Mongoid 已经加载了与数据库的连接。如何访问数据库以直接运行我的更新查询?
7 回答
如果您使用的是 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,因此从技术上讲,每个文档都通过 moped 或 mongodb-ruby 驱动程序通过 mongoid 映射到 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")
How to more on mongo query and how mongoid map those using moped 你可以按照查询的这一部分来描述如何通过 moped 在内部实现查询
希望这有帮助
对于 Mongoid 6:
db = Mongoid::default_client
collection = db[:collection_name]
简短的回答是轻便摩托车。这是构建 Mongoid 的较低级别的 API,如果您已经使用 Mongoid,它将可用。Moped API 是原始 MongoDB 操作的精简包装器。这里的文档:http: //mongoid.org/en/moped/docs/driver.html应该很有用。
就像这里提到的任何人一样,您的答案是助力车。这是我的 ruby 脚本示例(简单文件 test.rb)
- 定义一个 mongoid.yml(在本例中,在 localhost)
development:
sessions:
default:
database: test_development
hosts:
- localhost:27017
options:
设置加载配置和测试集合
#!/usr/bin/env ruby 需要 'mongoid'
Mongoid.load!("path/to/file/mongoid.yml",:development) # :development 对应mongoid.yml 第一行环境 db = Mongoid::Sessions.default puts "Collection documents count :> #{db[ :collection].find.count}"
如果您使用 mongoid 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