Uploaded image for project: 'Java Driver'
  1. Java Driver
  2. JAVA-1263

Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned

    XMLWordPrintableJSON

Details

    • Icon: Improvement Improvement
    • Resolution: Done
    • Icon: Major - P3 Major - P3
    • 2.12.3, 3.0.0
    • None
    • Write Operations
    • None

    Description

      Server versions before 2.6 only return the 'upserted' field in an update result when the upserted _id is an ObjectId. If the user provides any other value for _id in the query spec, or update document (for a replace operation) the upserted field is not returned. This causes invalid counts for nUpserted in the Bulk API result set.

      The purpose of this ticket is to work around the issue in the Java driver.

      In all of these examples the server upserts a new document but does not return the _id of the document inserted:

      >>> db.test.count()
      0
      >>> db.test.update({'_id': 0}, {'$set': {'a': 0}}, upsert=True)
      {u'updatedExisting': False, u'connectionId': 1, u'ok': 1.0, u'err': None, u'n': 1}
      >>> db.test.find_one({'_id': 0})
      {u'a': 0, u'_id': 0}
      >>> db.test.update({'a': 1}, {'_id': 1}, upsert=True)
      {u'updatedExisting': False, u'connectionId': 1, u'ok': 1.0, u'err': None, u'n': 1}
      >>> db.test.find_one({'_id': 1})
      {u'_id': 1}
      >>> db.test.update({'_id': 3}, {'_id': 2}, upsert=True)
      {u'updatedExisting': False, u'connectionId': 1, u'ok': 1.0, u'err': None, u'n': 1}
      >>> db.test.find_one({'_id': 2})
      {u'_id': 2}
      >>> c.server_info()['version']
      u'2.4.10'

      Attachments

        Activity

          People

            ross@mongodb.com Ross Lawley
            barrie Barrie Segal
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: