[CSHARP-2370] BulkWrite failed on Upsert Created: 29/Aug/18  Updated: 27/Oct/23  Resolved: 05/Nov/18

Status: Closed
Project: C# Driver
Component/s: Command Operations
Affects Version/s: 2.7.0
Fix Version/s: None

Type: Bug Priority: Minor - P4
Reporter: Francis Marasigan Assignee: Unassigned
Resolution: Works as Designed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

Bulkwrite throw duplicate exception on a collection with unique key index (non-primary index) even setting up the UpdateOneModel Upsert = true. 

Ex:

 

// code placeholder
 
var bulkOps = new List<WriteModel<Student>>();
var bulkOps = new List<WriteModel<Student>>();
foreach (var student in students) 
{ 
var newId = Guid.NewGuid(); 
var update = Builders<Student>.Update 
  .Set(a => a.FirstName, student.FirstName) 
  .Set(a => a.LastName, student.LastName) 
  .Set(a => a.SomeField1, student.SomeField1) 
  .Set(a => a.LastModifiedDate, student.LastModifiedDate) 
  .SetOnInsert(a => a.PostedDate, student.PostedDate) 
  .SetOnInsert(a => a.Id, newId); 
var upsertOne = new UpdateOneModel<Student>(Builders<Student>.Filter.Where(x => x.FirstName == student.FirstName && x.LastName == student.LastName), update) { IsUpsert = true }; 
bulkOps.Add(upsertOne);  
 
//-- if executing individually, upsert works just fine. // var result = await Collection.UpdateOneAsync(x => x.FirstName == student.FirstName && x.LastName == student.LastName, update, new UpdateOptions { IsUpsert = true });
 
}
 
//-- This will throw duplicate exceptionvar result = await Collection.BulkWriteAsync(bulkOps);

 

 



 Comments   
Comment by Francis Marasigan [ 29/Aug/18 ]

Nevermind. I found a bug in my code. Non-issue. Sorry for false reporting.

Comment by Francis Marasigan [ 29/Aug/18 ]

Reformatted code sample:

var bulkOps = new List<WriteModel<Student>>();
foreach (var student in students) 
{ 
var newId = Guid.NewGuid(); 
var update = Builders<Student>.Update 
  .Set(a => a.FirstName, student.FirstName) 
  .Set(a => a.LastName, student.LastName) 
  .Set(a => a.SomeField1, student.SomeField1) 
  .Set(a => a.LastModifiedDate, student.LastModifiedDate) 
  .SetOnInsert(a => a.PostedDate, student.PostedDate) 
  .SetOnInsert(a => a.Id, newId); 
var upsertOne = new UpdateOneModel<Student>(Builders<Student>.Filter.Where(x => x.FirstName == student.FirstName && x.LastName == student.LastName), update) { IsUpsert = true }; 
bulkOps.Add(upsertOne);  
 
//-- if executing individually, upsert works just fine. 
// var result = await Collection.UpdateOneAsync(x => x.FirstName == student.FirstName && x.LastName == student.LastName, update, new UpdateOptions { IsUpsert = true }); 
}
 
//-- This will throw duplicate exception
var result = await Collection.BulkWriteAsync(bulkOps);

Generated at Wed Feb 07 21:42:22 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.