web-dev-qa-db-ja.com

ドキュメントDBに複数のドキュメント(バルク)をアップロードする方法

オブジェクトに複数のドキュメントがあるドキュメントリスト(オブジェクト)があります。つまり、Jsonレコードが存在しますが、そのドキュメントの束(レコード)をアップロードしようとすると、ドキュメントDBにアップロードされませんが、単一のドキュメントレコードをアップロードすると、正常にアップロードされます。

  List<MyModelClass> listObj = new List<MyModelClass>();
  Document doc = await DocumentClient.CreateDocumentAsync("dbs/" + DocumentDatabase.Id + "/colls/" + DocumentCollection.Id, listObj);

上記のコードは機能していません.....

   foreach (var item in listObj )
    {
      Document doc = await Client.CreateDocumentAsync("dbs/" + DocumentDatabase.Id + "/colls/" + DocumentCollection.Id, item);
    }

このコードは私のために働いています.....

 Syntax : CreateDocumentAsync(String, Object, RequestOptions, Boolean)
 Object :- Document object // I Know it as per syntax it need to be "Document Type".

すべてのドキュメントを一度にアップロードする他の方法が必要です..。

11
Pravin Sharma

一度に複数のドキュメントを挿入することはできません。 CreateDocumentAsync()の呼び出しは、単一のドキュメントのみを対象としています。

これを実現するには、これを実現するためのサーバー側のストアドプロシージャを考案し、ドキュメント配列を1回の呼び出しで関数に渡す必要があります。 この回答 を見て、サーバー側の関数を使用して、基本的にドキュメントの配列をローカルで作成し、ストアドプロシージャで配列をウォークスルーすることで、他の誰かがこれをどのように解決したかを確認することをお勧めします。したがって、次のようなものを作成します(その回答から抜粋):

docObject = {
  "items": [{doc}, {doc}, {doc}]
}

そして、docObjectをストアドプロシージャに渡します。

最終的に、ストアドプロシージャは、ドキュメントごとに1つずつ、個別の挿入呼び出しを実行します。しかし...複数のネットワークラウンドトリップはありません。また、挿入はトランザクションになります(挿入のいずれかが失敗した場合、または例外をスローした場合、他の挿入はロールバックされます)。

16
David Makogon

Microsoft.Azure.CosmosDB.BulkExecutorライブラリを使用して、一度に複数のドキュメントを挿入できるようになりました

https://docs.Microsoft.com/en-us/Azure/cosmos-db/bulk-executor-dot-net

3
Dmitry Dzygin