C # - Космос БД массовый upsert - PullRequest
0 голосов
/ 22 мая 2019

У меня есть функция Azure, запускаемая таймером, в котором я хочу обновить документы в CosmosDB.Теперь я использую функцию UpdateOneAsync с опцией IsUpsert = true, чтобы выполнить обновление (или вставить, если документ не существует).

Однако я выполняю операцию обновления внутри цикла foreach, поэтому операция обновления выполняется для каждого элемента.Как я могу выполнить массовое обновление (upsert), выполнив всего одну операцию после завершения цикла foreach?

Вот мой код прямо сейчас:

foreach (var group in GetGroups(date, time, hour))
{
    dic = new MyDictionary<string>();

    //... some operations

    List<BsonElement> documents = new List<BsonElement>();
    documents.Add(new BsonElement("$inc", new BsonDocument(dic)));
    documents.Add(new BsonElement("$set", new BsonDocument(new Dictionary<string, string>() { { "c", key }, { "d", date } })));

    var doc = clicksDoc.UpdateOneAsync(t => t["_id"] == "c-" + key + "-" + date, new BsonDocument(documents), new UpdateOptions() { IsUpsert = true }).Result;
}

Вместо этого я бы хотелвыполнить только одно обновление после цикла.Как я могу это сделать?

1 Ответ

1 голос
/ 22 мая 2019

Вы можете использовать метод BulkUpdateAsync из BulkExecutor,

List<UpdateItem> updateList = initialDocuments.Select(d =>
                new UpdateItem(
                    d.id,
                    d.AccountNumber,
                    new List<UpdateOperation> {
                        new SetUpdateOperation<string>(
                            "NewSimpleProperty", 
                            "New Property Value"),
                        new SetUpdateOperation<dynamic>(
                            "NewComplexProperty", 
                            new {
                                prop1 = "Hello",
                                prop2 = "World!"
                            }),
                        new UnsetUpdateOperation(nameof(FakeOrder.DocumentIndex)),
                    }))
                .ToList();

            var updateSetResult = BulkUpdatetDocuments(_database, _collection, updateList).GetAwaiter().GetResult();

и

var executor = new BulkExecutor(_documentClient, collectionResource);
await executor.InitializeAsync();
return await executor.BulkUpdateAsync(updates);

ОБРАЗЕЦ

...