@@ -258,7 +258,28 @@ public static BulkWriteBatchResult Create(
258258 {
259259 var processedRequests = new [ ] { request } ;
260260 var unprocessedRequests = Enumerable . Empty < WriteRequest > ( ) ;
261- var upsertId = ( writeConcernResult == null ) ? null : writeConcernResult . Upserted ;
261+ BsonValue upsertId = null ;
262+ var documentsAffected = 0L ;
263+ if ( writeConcernResult != null )
264+ {
265+ documentsAffected = writeConcernResult . DocumentsAffected ;
266+ upsertId = writeConcernResult . Upserted ;
267+ var updateRequest = request as UpdateRequest ;
268+ if ( upsertId == null &&
269+ documentsAffected == 1 &&
270+ updateRequest != null &&
271+ updateRequest . IsUpsert . GetValueOrDefault ( false ) &&
272+ ! writeConcernResult . UpdatedExisting )
273+ {
274+ // Get the _id field first from the Update document
275+ // and then from the Query document.
276+ upsertId = updateRequest . Update . ToBsonDocument ( )
277+ . GetValue (
278+ "_id" ,
279+ updateRequest . Query . ToBsonDocument ( )
280+ . GetValue ( "_id" , null ) ) ;
281+ }
282+ }
262283 var upserts = ( upsertId == null ) ? Enumerable . Empty < BulkWriteUpsert > ( ) : new [ ] { new BulkWriteUpsert ( 0 , upsertId ) } ;
263284 var writeErrors = __noWriteErrors ;
264285 WriteConcernError writeConcernError = null ;
@@ -277,7 +298,6 @@ public static BulkWriteBatchResult Create(
277298 }
278299 }
279300
280- var documentsAffected = ( writeConcernResult == null ) ? 0 : writeConcernResult . DocumentsAffected ;
281301 if ( request . RequestType == WriteRequestType . Insert && writeErrors . Count == 0 )
282302 {
283303 documentsAffected = 1 ; // note: DocumentsAffected is 0 for inserts
0 commit comments