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

And*_*rew 28 ruby-on-rails mongodb mongoid

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

And*_*rew 33

如果您正在使用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
Run Code Online (Sandbox Code Playgroud)


小智 11

对于Mongoid 5:

db = Mongoid::Clients.default

collection = db[:collection_name]
Run Code Online (Sandbox Code Playgroud)

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


Vir*_*ren 6

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

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

所以,如果你有模特喜欢

class PerformerSource 
  include Mongoid::Document
  ## Definition

end
Run Code Online (Sandbox Code Playgroud)

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

PerformerSource.collection.insert("something")
## where something is json document you want to insert
Run Code Online (Sandbox Code Playgroud)

这将为您提供该文档的轻便摩托车(如果使用mongoid 3)连接

2)你也可以这样做

 Mongoid::Sessions.default.collections.find { |document| document.name == "performer_sources"}.insert("something")
Run Code Online (Sandbox Code Playgroud)

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

希望这有帮助