Bạn đã xem AddToSet chưa , nếu bạn sử dụng điều này kết hợp với chức năng cập nhật thay vì chức năng thay thế, nó sẽ kiểm soát tốt hơn tính nguyên tử của bạn.
var updateBuilder = Builders<Item>.Update.AddToSet(items => items.SubItems, new SubItem());
collection.UpdateOne(itemFilter, updateBuilder);
Như vậy trong trường hợp của bạn.
public Task Save(string itemId, SubItem subItem)
{
var itemFilter = Builders<Item>.Filter.Eq(v => v.Id, itemId);
var collection = _db.GetCollection<Item>("Items");
var updateBuilder = Builders<Item>.Update.AddToSet(items => items.SubItems, subItem);
collection.UpdateOneAsync(itemFilter, updateBuilder, new UpdateOptions() { IsUpsert = true }).Wait();
}