【问题标题】:How to fire raw MongoDB queries directly in Ruby如何在 Ruby 中直接触发原始 MongoDB 查询
【发布时间】:2011-07-01 12:39:29
【问题描述】:

有什么方法可以直接在 Ruby 中触发原始 mongo 查询,而不是将它们转换为原生 Ruby 对象?

我浏览了 Ruby Mongo 教程,但在任何地方都找不到这样的方法。

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

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

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

【问题讨论】:

    标签: ruby mongodb


    【解决方案1】:

    这里有一个(可能)更好的关于如何直接进入 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::CursorEnumerable 这样您就可以访问所有常用的迭代 eachfirstmap 等朋友和我的一位 收藏,each_with_object:

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

    Mongo::DB 上还有 commandeval 方法可以满足您的需求。

    【讨论】:

    • 这是什么版本的mongoid?
    • @newdark 我在那里没有看到任何对 Mongoid 的引用。这是基于六年前的任何版本的 MongoMapper,AFAIK 直接从 MongoDB 人员那里使用了 Ruby 接口。
    【解决方案2】:

    如果您使用 mongoid,您将找到问题的答案here

    【讨论】:

      【解决方案3】:

      如果您使用的是 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
      

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 2014-05-21
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 2021-09-24
        • 1970-01-01
        相关资源
        最近更新 更多