Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-1640

$in operator for behaves unexpected on upserts

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: 1.6.1
    • Component/s: Write Ops
    • Labels:
      None
    • Environment:
      any
    • ALL

      We would like to reduce the number of updates by using the $in operator going from

      buckets = [ '2010', '2010-08', '2010-08-01' ]
      buckets.each do |bucket|
      @totals.update(

      { 'bucket' => bucket }

      , { '$inc' => { 'downloads' => 1 }}, :upsert => true)
      end

      to

      buckets = [ '2010', '2010-08', '2010-08-01' ]
      @totals.update({ 'bucket' =>

      { "$in" => buckets }

      }, { '$inc' => { 'downloads' => 1 }}, :upsert => true)

      Unfortunately we get very strange and inconsistent results.

      db.test.find()
      db.test.update(

      {"b": 2}

      , { "$inc":

      { "d": 1 }

      }, true)
      db.test.find()

      { "_id" : ObjectId("4c6d1e345153667a3fd349b8"), "b" : 2, "d" : 1 }

      db.test.update(

      {"b": 3}

      , { "$inc":

      { "d": 1 }

      }, true)
      db.test.find()

      { "_id" : ObjectId("4c6d1e345153667a3fd349b8"), "b" : 2, "d" : 1 } { "_id" : ObjectId("4c6d1e485153667a3fd349b9"), "b" : 3, "d" : 1 }

      db.test.update({"b":

      { "$in": [ 2, 3, 4 ] }

      }, { "$inc":

      { "d": 1 }

      }, true)
      db.test.find()

      { "_id" : ObjectId("4c6d1e345153667a3fd349b8"), "b" : 2, "d" : 2 } { "_id" : ObjectId("4c6d1e485153667a3fd349b9"), "b" : 3, "d" : 1 }

      We would expect also

      { "_id" : ObjectId("4c6d1e485153667a3fd349ba"), "b" : 4, "d" : 1 }

      to be there. Then we found there is 'multi' option to turn on in (from http://www.mongodb.org/display/DOCS/Updating )

      "multi - if all documents matching criteria should be updated"

      But that still does not create a documents as expected.

      db.test.update({"b":

      { "$in": [ 2, 3, 4 ] }

      }, { "$inc":

      { "d": 1 }

      }, true, true)
      db.test.find()

      { "_id" : ObjectId("4c6d1e345153667a3fd349b8"), "b" : 2, "d" : 3 } { "_id" : ObjectId("4c6d1e485153667a3fd349b9"), "b" : 3, "d" : 2 }

      Now even more weird. Trying again it does create a document - but not the one expected:

      db.test.update({"b":

      { "$in": [ 55, 66 ] }

      }, { "$inc":

      { "d": 1 }

      }, true, true)
      db.test.find()

      { "_id" : ObjectId("4c6d1e345153667a3fd349b8"), "b" : 2, "d" : 3 } { "_id" : ObjectId("4c6d1e485153667a3fd349b9"), "b" : 3, "d" : 2 } { "_id" : ObjectId("4c6d1f1a5153667a3fd349ba"), "d" : 1 }

      What are we missing here?

            Assignee:
            Unassigned Unassigned
            Reporter:
            tcurdt Torsten Curdt
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: