我在一个集合上使用 DocumentDB 和.NET SDK,并使用 .NET 为该集合设置了自定义索引策略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);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了不一致的冲突错误:Microsoft.Azure.Documents.DocumentClientException: Message: {"Errors":["Resource with specified id or name already exists"]}
但是,由于我使用自动 ID 生成,因此即使在并发写入的情况下也不应该有重复的 id。
以前有人遇到过这种行为吗?我怀疑如果 DocumentDB 未确认成功的写入,则这可能是由 .NET SDK 执行的重试触发的。
冲突错误: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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7585 次 |
| 最近记录: |