-
Type: Improvement
-
Resolution: Done
-
Priority: Major - P3
-
None
-
Component/s: None
-
None
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 all drivers.
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'
There is a code review for the workaround in python here:
http://codereview.10gen.com/5468598634020864/
- depends on
-
CXX-335 Ensure we handle Bulk API edge case (DRIVERS-151)
- Closed
-
CDRIVER-372 Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned
- Closed
-
CSHARP-987 Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned
- Closed
-
NODE-196 Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned
- Closed
-
PYTHON-705 Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned
- Closed
-
RUBY-777 Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned
- Closed
-
JAVA-1263 Handle Bulk API edge case for pre-2.6 servers when upserted _id not returned
- Closed
- related to
-
SERVER-13865 Shell returns incorrect WriteResult for compatibility-mode upsert with non-OID equality pred on _id field
- Closed