2017-03-27 7 views
2

私はでDocumentDBを使用し、コレクションにはIndexingMode.Lazyを使用してカスタムインデックスポリシーを設定しました。これにより、コレクション上のすべての操作に対して、の整合性が提供されます。遅延インデックス付きコレクションで自動ID生成を使用してドキュメントを作成するときの競合エラー(409)

重要でないデータに対して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によって実行される再試行によってこれが引き起こされる可能性があります。

+0

「ToPersistentChunk」とは何ですか? 'CreateDocumentAsync'を呼び出す前に' id'プロパティを設定していますか、空にしておきますか? –

+0

基本的に、最初の 'chunk'のコピーを直列化可能な型にします。 私の問題は、SDKによる内部再試行と最終的な一貫性が関係していると思われます。文書が正しく作成されたとしても429エラーが発生することがあります。 –

答えて

0

競合エラー:Microsoft.Azure.Documents.DocumentClientException:メッセージ:{ "エラー":[ "既に存在している指定されたIDまたは名前を持つリソース"]}

409 Conflict

をするために設けIDを示しますPUTまたはPOST操作のリソースは、既存のリソースによって使用されています。 idプロパティChunkKeyプロパティの代わりにドキュメントを照会し、照会結果numに基づいてドキュメントを追加/置換することができます。

var num = client.CreateDocumentQuery<MyChunk>("dbs/{your db}/colls/{your collection}").Where(c => c.id == chunk.id).AsEnumerable().Count(); 
関連する問題