Mongo db tail cursor

I am trying to create an oplog watcher in ruby. So far I have a small script below.

require 'rubygems'
require 'mongo'
db = Mongo::Connection.new("localhost", 5151).db("local")
coll = db.collection('oplog.$main')

loop do
cursor = Mongo::Cursor.new(coll, :tailable => true)
    while not cursor.closed?
        if doc = cursor.next_document
            puts doc
        else
            sleep 1
        end
    end
end

The problem with this is that after 5 or 6 seconds, when it spits out a lot of data, the time runs out, and I get an error

C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/connection.rb
:807:in `check_response_flags': Query response returned CURSOR_NOT_FOUND. Either an invalid c
ursor was specified, or the cursor may have timed out on the server. (Mongo::OperationFailure
)
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
connection.rb:800:in `receive_response_header'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
connection.rb:768:in `receive'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
connection.rb:493:in `receive_message'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
connection.rb:491:in `synchronize'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
connection.rb:491:in `receive_message'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
cursor.rb:494:in `send_get_more'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
cursor.rb:456:in `refresh'
        from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/mongo-1.4.0/lib/../lib/mongo/
cursor.rb:124:in `next_document'
        from n.rb:7
        from n.rb:6:in `loop'
        from n.rb:6

What I do not understand is when I can see the actual data, how can he suddenly say that the cursor was not found. I am very new to the ruby ​​and any ideas about which direction I should take will be useful to me.

+5
source share
1 answer

, , , , . oplog, , .

require 'rubygems'
require 'mongo'
db = Mongo::Connection.new("localhost",5151).db("local")
coll = db.collection('oplog.$main')
loop do
cursor = Mongo::Cursor.new(coll, :timeout => false, :tailable => true)
    while not cursor.closed?
    begin
      if doc = cursor.next_document   
          puts "Timestamp"
          puts  doc["ts"]
          puts "Record"
          puts  doc["o"]
          puts "Affected Collection"
          puts doc["ns"]
      end
    rescue
        puts ""
        break
    end
  end
end

, . google mongodb-, .

+5

All Articles