如何直接在Ruby中激活原始MongoDB查询
有没有办法可以直接在Ruby中激活原始mongo查询而不是将它们转换为本机Ruby对象?
我浏览了Ruby Mongo教程,但我无法在任何地方找到这样的方法。
如果它是mysql,我会发出这样的查询。
ActiveRecord::Base.connection.execute("Select * from foo")
我的mongo查询有点大,它在MongoDB控制台中正确执行。 我想要的是直接在Ruby代码中执行相同的内容。
这是一个(可能)更好的迷你教程,介绍如何直接进入MongoDB的内容。 这可能无法解决您的具体问题,但它应该让您到MongoDB版本的SELECT * FROM table
。
首先,你需要一个Mongo::Connection
对象。 如果您正在使用MongoMapper,那么您可以在任何MongoMapper模型上调用connection
类方法来获取连接或直接向MongoMapper询问:
connection = YourMongoModel.connection connection = MongoMapper.connection
否则我猜你会使用from_uri
构造函数来构建自己的连接。
然后你需要掌握一个数据库,你可以使用数组访问表示法 , db
方法,或直接从MongoMapper获取当前的db
:
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)) }
Mongo::DB
上还有command
和eval
方法可以做你想要的。
如果你使用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 # "select * from collection" collection.find.each do |document| puts document.inspect end