2017-11-14 12 views
0

私はCosmos DBのストアドプロシージャに渡す大きなjsonを持っています。私はjsonドキュメントを分割し、複数のドキュメントを作成する必要があります。ストアドプロシージャ内のjsonにどのようにループするのですか?ストアドプロシージャのjson内でのループDocumentDB

例:以下のJsonを使用して、子ノードごとに個別のドキュメントを作成し、子ノードを持たない別のドキュメントを作成する必要があります。合計3つの文書。ストアドプロシージャ内でループと分割を行うにはどうすればよいですか?

{ 
    "id": "d93af7d3706e4f28882920366c017cd7", 
    "FamilyId": 989, 
    "LastName": "Andersen", 
    "Parents": [ 
    { 
     "FamilyName": null, 
     "FirstName": "Thomas" 
    }, 
    { 
     "FamilyName": null, 
     "FirstName": "Mary Kay" 
    } 
    ], 
    "Children": [ 
    { 
     "ChildId":001, 
     "FamilyName": null, 
     "FirstName": "Henriette Thaulow", 
     "Gender": "female", 
     "Grade": 5, 
     "Pets": [ 
     { 
      "GivenName": "Fluffy" 
     } 
     ] 
    }, 
    { 
     "ChildId":002 
     "FamilyName": null, 
     "FirstName": "Maria Thaulow", 
     "Gender": "female", 
     "Grade": 12, 
     "Pets": [ 
     { 
      "GivenName": "Grizzly" 
     } 
     ] 
    } 
    ], 
    "Address": { 
    "State": "WA", 
    "County": "King", 
    "City": "Seattle" 
    }, 
    "IsRegistered": false 
} 

答えて

0

実際には、ストアドプロシージャを使用して一括インポートデータを実装できます。

official tutorialのコードを参照してください。

ストアドプロシージャがクライアントから実行される
function bulkImport(docs) { 
    var collection = getContext().getCollection(); 
    var collectionLink = collection.getSelfLink(); 

    // The count of imported docs, also used as current doc index. 
    var count = 0; 

    // Validate input. 
    if (!docs) throw new Error("The array is undefined or null."); 

    var docsLength = docs.length; 
    if (docsLength == 0) { 
     getContext().getResponse().setBody(0); 
    } 

    // Call the create API to create a document. 
    tryCreate(docs[count], callback); 

    // Note that there are 2 exit conditions: 
    // 1) The createDocument request was not accepted. 
    // In this case the callback will not be called, we just call setBody and we are done. 
    // 2) The callback was called docs.length times. 
    // In this case all documents were created and we don’t need to call tryCreate anymore. Just call setBody and we are done. 
    function tryCreate(doc, callback) { 
     var isAccepted = collection.createDocument(collectionLink, doc, callback); 

     // If the request was accepted, callback will be called. 
     // Otherwise report current count back to the client, 
     // which will call the script again with remaining set of docs. 
     if (!isAccepted) getContext().getResponse().setBody(count); 
    } 

    // This is called when collection.createDocument is done in order to process the result. 
    function callback(err, doc, options) { 
     if (err) throw err; 

     // One more document has been inserted, increment the count. 
     count++; 

     if (count >= docsLength) { 
      // If we created all documents, we are done. Just set the response. 
      getContext().getResponse().setBody(count); 
     } else { 
      // Create next document. 
      tryCreate(docs[count], callback); 
     } 
    } 
} 

、RequestOptionsは、パーティションキーを指定して、ストアドプロシージャは、このパーティションのコンテキストで実行され、別のパーティションキー値を持つドキュメントに(例えば登録)動作することができません。

できることは、パーティションキーごとにクライアントからストアドプロシージャを実行することです。たとえば、ストアドプロシージャがドキュメントをバルク作成する場合は、パーティションキーでドキュメントをグループ化し、各グループを(並列に実行できる)ストアドプロシージャに送信して、RequestOptionsにパーティションキー値を指定します。

お手伝いします。

+0

ありがとうございます。@ジェイ、私はサンプルを見て、それは一括インポートの多くです。より具体的に質問を更新しました。 –

+0

@b_kodersこんにちは、完全なJSONをいくつかのドキュメントに分割する必要があるのか​​どうかはわかりません。そしてなぜあなたのJSONに同じ子キーが現れるのですか? 子供は配列だと思います。 –

+0

@b_kodersこんにちは、どんな進歩ですか? –

関連する問題