使用Ruby监听MongoDB中嵌入文档的插入

时间:2015-02-17 19:39:08

标签: ruby mongodb mongoid

我正在为发出回调的Restful应用程序创建一个基于ruby的回调侦听器工具,这样我就可以访问所发出的回调,比如RequestBin。对于后端,我有MongoDB,其中我有一个主文档,每个会话创建一个可重用的桶来监听请求,我有一个嵌入式文档,每个请求都填充。

class Bin
    include Mongoid::Document
    include Mongoid::Timestamps
    embeds_many :callbacks
    field :bin_id, type: String
end

class Callback
    include Mongoid::Document
    include Mongoid::Timestamps
    embedded_in :bin, :inverse_of => :bins
    field :callback_id, type: Integer
    field :http_method, type: String
    field :params, type: String
    field :headers, type: String
    field :raw_post, type: String
end

我的问题是有没有办法监听MongoDB中回调文件的插入? 我在互联网上环顾四周,发现MongoDB具有所谓的capped collectionstailable cursors,它允许MongoDB将数据推送到监听器。但对我来说,它不会起作用,因为我已经创建了主文档,我必须听取嵌入式文档的创建。

2 个答案:

答案 0 :(得分:1)

不。没有办法在MongoDB中监听文档更改。

搜索“mongodb触发器”以了解更多信息。

How to listen for changes to a MongoDB collection?

答案 1 :(得分:0)

所以我最终做了以下事情,

  def self.wait_for_callback(bin_id)
    host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
    port = ENV['MONGO_RUBY_DRIVER_PORT'] || MongoClient::DEFAULT_PORT

    db = MongoClient.new(host, port).db('mongoid')
    coll = db.collection('bins')
    retries = 0

    res = coll.find("bin_id" => bin_id).to_a.first
    loop do
      if res["callbacks"].nil? && retries < 45
        sleep 5
        puts "Retry: #{retries}"
        retries += 1
        res = coll.find("bin_id" => bin_id).to_a.first
      else
        return res["callbacks"].to_a.first       
      end
    end
    return nil
  rescue Exception => e
    @@success =false
    @@errors << "Error:\n#{e.inspect}"
    if $debug_flag == "debug"
      puts @@errors 
   end
    return nil
  end

但这里的问题是反复查询。那么有更好的方法吗?