如何直接在Ruby中激活原始MongoDB查询

时间:2011-07-01 12:39:30

标签: ruby mongodb

有没有办法可以直接在Ruby中激活原始mongo查询而不是将它们转换为本机Ruby对象?

我参加了Ruby Mongo教程,但我无法在任何地方找到这样的方法。

如果是mysql,我会发出类似这样的查询。

ActiveRecord::Base.connection.execute("Select * from foo")

我的mongo查询有点大,它在MongoDB控制台中正常执行。我想要的是直接在Ruby代码中执行相同的内容。

3 个答案:

答案 0 :(得分:23)

这是一个(可能)更好的迷你教程,介绍如何直接进入MongoDB的内容。这可能无法解决您的具体问题,但它应该可以使您获得SELECT * FROM table的MongoDB版本。


首先,你需要一个Mongo::Connection对象。如果 您正在使用MongoMapper,那么您可以拨打connection 任何MongoMapper模型上的类方法来获取连接 或直接向MongoMapper询问:

connection = YourMongoModel.connection
connection = MongoMapper.connection

否则我猜你会使用from_uri构造函数来构建 你自己的联系。

然后你需要掌握数据库,你可以这样做 使用array access notationdb方法或获取 来自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,所以你可以访问所有常用的迭代 朋友,例如eachfirstmap以及我个人之一 收藏夹,each_with_object

a = cursor.each_with_object([]) { |x, a| a.push(mangle(x)) }

Mongo::DB上的commandeval方法也可以做你想做的事。

答案 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