我目前正在使用Azure Mongo API for documentDB。然而,这引起了许多令人头疼的问题,例如将文档插入数据库并尝试在InsertMany()
期间忽略重复的键错误。如果批处理中的文档是重复的,它会立即抛出并出现错误并返回,即使我要求它继续进行。我知道为什么我们正在获取这些,因为我忙于将数据从非分区集合移动到分区集合,并且很有可能它们已经被迁移。
显然在插入过程中,你可以通过isOrdered = false within the insertmanyoptions()
而它应该这样做,但事实并非如此。
在最终放弃之后,我试图通过BulkWriteAsync
尝试使用IsUpsert = true
同时使用 public async Task BulkInsertDeviceConfigData(List<DeviceEventConfigure> Elements)
{
var models = new List<WriteModel<BsonDocument>>();
// use ReplaceOneModel with property IsUpsert set to true to upsert whole documents
foreach (var element in Elements)
{
var bsonDoc = element.ToBsonDocument();
models.Add(new ReplaceOneModel<BsonDocument>(new BsonDocument("_id", element.Id), bsonDoc) { IsUpsert = true });
};
await BulkWriteAsync(models as IEnumerable<WriteModel<DeviceEventData>>);
}
public virtual async Task BulkWriteAsync(IEnumerable<WriteModel<T>> models)
{
await Collection.BulkWriteAsync(models);
}
可悲的是我得到了一个有趣的错误:
值不能为空。参数名称:请求
以下是我的代码。
import string
这一直在伤害我,因为我们最近一直在增加我们的RU以做到这一点,尽管可悲的是没有成功。
这是Azure Mongo API问题还是我?
答案 0 :(得分:0)
也许是您的演员
models as IEnumerable<WriteModel<DeviceEventData>>
无效,导致参数请求的值为空。我认为不必强制转换为BsonDocument,因此可以将其写为:
public async Task BulkInsertDeviceConfigData(List<DeviceEventConfigure> Elements)
{
var models = new List<WriteModel<DeviceEventConfigure>>();
// use ReplaceOneModel with property IsUpsert set to true to upsert whole documents
foreach (var element in Elements)
{
models.Add(new ReplaceOneModel<DeviceEventConfigure>(new BsonDocument("_id", element.Id), element) { IsUpsert = true });
};
await BulkWriteAsync(models as IEnumerable<WriteModel<DeviceEventConfigure>>);
}
public virtual async Task BulkWriteAsync(IEnumerable<WriteModel<T>> models)
{
await Collection.BulkWriteAsync(models);
}