有没有办法可以直接在Ruby中激活原始mongo查询而不是将它们转换为本机Ruby对象?
我参加了Ruby Mongo教程,但我无法在任何地方找到这样的方法。
如果是mysql,我会发出类似这样的查询。
ActiveRecord::Base.connection.execute("Select * from foo")
我的mongo查询有点大,它在MongoDB控制台中正常执行。我想要的是直接在Ruby代码中执行相同的内容。
答案 0 :(得分:23)
这是一个(可能)更好的迷你教程,介绍如何直接进入MongoDB的内容。这可能无法解决您的具体问题,但它应该可以使您获得SELECT * FROM table
的MongoDB版本。
首先,你需要一个Mongo::Connection
对象。如果
您正在使用MongoMapper,那么您可以拨打connection
任何MongoMapper模型上的类方法来获取连接
或直接向MongoMapper询问:
connection = YourMongoModel.connection
connection = MongoMapper.connection
否则我猜你会使用from_uri
构造函数来构建
你自己的联系。
然后你需要掌握数据库,你可以这样做
使用array access notation,db
方法或获取
来自MongoMapper的当前版本:
db = connection['database_name'] # This does not support options.
db = connection.db('database_name') # This does support options.
db = MongoMapper.database # This should be configured like
# the rest of your app.
现在你手中有一个漂亮的Mongo::DB
实例。
但是,您可能希望Collection
做任何有趣的事情
你可以使用数组访问表示法或
collection
方法:
collection = db['collection_name']
collection = db.collection('collection_name')
现在你的行为有点像SQL表
您可以count
使用find
创建了多少内容或查询它:
cursor = collection.find(:key => 'value')
cursor = collection.find({:key => 'value'}, :fields => ['just', 'these', 'fields'])
# etc.
现在你拥有了你真正追求的东西:烤箱里的热点Mongo::Cursor
指向您感兴趣的数据。Mongo::Cursor
是
一个Enumerable
,所以你可以访问所有常用的迭代
朋友,例如each
,first
,map
以及我个人之一
收藏夹,each_with_object
:
a = cursor.each_with_object([]) { |x, a| a.push(mangle(x)) }
答案 1 :(得分:4)
如果您使用mongoid,您将找到问题的答案here。
答案 2 :(得分:2)
如果您正在使用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
# "select * from collection"
collection.find.each do |document|
puts document.inspect
end