在惰性索引集合上使用自动 ID 生成功能创建文档时出现冲突错误 (409)

问题描述 投票:0回答:1

我将 DocumentDB 与 .NET SDK 一起使用在一个集合上,并使用

IndexingMode.Lazy
为该集合设置了自定义索引策略。这为集合上的所有操作提供了最终一致性

我想对非关键数据进行类似更新插入的操作:我可以承受重复和错过的更新。

我使用这样的代码:

public async Task UpsertChunk(MyChunk chunk)
{
    var id = _documentClient
                    .CreateDocumentQuery<PersistentChunk>()
                    .Where(c => c.ChunkKey == chunk.ChunkKey)
                    .Select(c => c.id)
                    .FirstOrDefault();

    var persistentChunk = chunk.ToPersistentChunk();
    if (string.IsNullOrEmpty(id))
    {
        await _documentClient.CreateDocumentAsync(_collectionUri, persistentChunk);
    }
    else
    {
        persistentChunk.id = id;
        var uri = UriFactory.CreateDocumentUri(_databaseId, _collectionId, id);
        await _documentClient.ReplaceDocumentAsync(uri, persistentChunk);
    }
}

我明白,不一致冲突错误

Microsoft.Azure.Documents.DocumentClientException: Message: {"Errors":["Resource with specified id or name already exists"]}

但是,由于我使用自动 ID 生成,因此即使在并发写入的情况下也不应该有重复的 id。

有人遇到过这种行为吗? 我怀疑如果 DocumentDB 未确认成功的写入,则这可能是由 .NET SDK 执行的重试触发的。

azure-cosmosdb
1个回答
0
投票

冲突错误:Microsoft.Azure.Documents.DocumentClientException:消息:{“错误”:[“具有指定 ID 或名称的资源已存在”]}

409 冲突 表示在 PUT 或 POST 操作上为资源提供的 ID 已被现有资源占用。请尝试通过id属性而不是ChunkKey属性来查询文档,然后就可以根据查询结果决定添加/替换文档

num

var num = client.CreateDocumentQuery<MyChunk>("dbs/{your db}/colls/{your collection}").Where(c => c.id == chunk.id).AsEnumerable().Count();
© www.soinside.com 2019 - 2024. All rights reserved.