Ordered insert
Ordered behavior
When adding multiple documents using the InsertMany
method and if an error occurs with one of the documents to be added, by default MongoDB will return an error without processing the remain documents in the array. For example, if you try to insert 3 documents and the 2nd violates a unique index key, then the 1st one will be added in the collection but 2nd and 3rd won't. Let's see it in action.
var sportsCollection = bettingDatabase
.GetCollection<Sport>(Constants.SportsCollection);
// Sport title is the identifier _id field
var sports = new List<Sport>
{
new Sport { Title = "Soccer", TotalEvents = 100 },
new Sport { Title = "Basketball", TotalEvents = 50 },
new Sport { Title = "Tennis", TotalEvents = 60 },
};
// Insert 3 documents
await sportsCollection.InsertManyAsync(sports);
// Now try to add 3 more
// The 2nd though
var sportsToAdd = new List<Sport>
{
new Sport { Title = "Volleyball", TotalEvents = 12 },
// This should cause an error and stop further processing
new Sport { Title = "Basketball", TotalEvents = 44 },
// This will never be inserted
new Sport { Title = "Formula 1", TotalEvents = 67 },
};
try
{
await sportsCollection.InsertManyAsync(sportsToAdd);
}
catch (MongoBulkWriteException e)
{
Utils.Log(e.Message);
}
Unordered behavior
You can configure your multiple documents insertions, to continue even if when some of the documents cause errors, by informing MongoDB not to use the default ordered insert behavior. You can do this by passing an InsertManyOptions
argument in the InsertMany
method and setting IsOrdered = false
.
var sportsCollection = bettingDatabase
.GetCollection<Sport>(Constants.SportsCollection);
// Sport title is the identifier _id field
var sports = new List<Sport>
{
new Sport { Title = "Soccer", TotalEvents = 100 },
new Sport { Title = "Basketball", TotalEvents = 50 },
new Sport { Title = "Tennis", TotalEvents = 60 },
};
// Insert 3 documents
await sportsCollection.InsertManyAsync(sports);
var sportsToAddWithRollback = new List<Sport>
{
new Sport { Title = "Volleyball", TotalEvents = 12 },
// This should cause an error
new Sport { Title = "Basketball", TotalEvents = 11 },
// But this will be inserted as well
new Sport { Title = "Baseball", TotalEvents = 44 },
// This should cause an error
new Sport { Title = "Tennis", TotalEvents = 67 },
// But this will be inserted as well
new Sport { Title = "Moto GP", TotalEvents = 12 }
};
// Switch off ordered insert
await sportsCollection.InsertManyAsync(sportsToAddWithRollback,
new InsertManyOptions
{
IsOrdered = false
});
InsertMany
will cause an MongoBulkWriteException
exception with both ordered and unordered behavior
Last updated