Azure MongoDB API批量插入

时间:2017-05-07 19:32:50

标签: c# mongodb azure azure-cosmosdb database

我目前正在使用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

enter image description here

这一直在伤害我,因为我们最近一直在增加我们的RU以做到这一点,尽管可悲的是没有成功。

这是Azure Mongo API问题还是我?

1 个答案:

答案 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);
}