创建在Lazy-indexed集合上生成自动ID的文档时出现冲突错误(409)

时间:2017-03-27 14:48:50

标签: azure-cosmosdb

我在一个集合上使用带有.NET SDK的DocumentDB,我使用IndexingMode.Lazy为其设置了自定义索引策略。这为集合上的所有操作提供了最终一致性

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

我使用这样的代码:

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执行的重试可能会触发这种情况。

1 个答案:

答案 0 :(得分:0)

  

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

409 Conflict表示现有资源已为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();