2017-09-27 9 views
0

ノードを使用してAzure Document DB(cosmos DB)パーティションコレクションを作成しようとしています。node.jsでAzure DocumentDBパーティションコレクションを作成する

function _getOrCreateCollectionAsync(databaseUrl, collection){ 
var collectionUrl = `${databaseUrl}/colls/${collection.name}`, 
    def = Q.defer(); 

    console.log("getting collection: " + collectionUrl); 

    client.readCollection(collectionUrl, (err, result) => { 
     if (err) { 
      if (err.code == 404) { 
       console.log("collection " + collection.name + " not found... creating..."); 

       var colOptions = {}; 
       colOptions.offerThroughput = collection.azureOptions.offerThroughput || 10000; //default is 10k 
       colOptions.partitionKey = ["/data"]; 
       // colOptions.partitionKey = ["data"]; 
       // colOptions.partitionKey = "/data"; 
       // colOptions.partitionKey = "data"; 

       var reqOptions = { 
        id : collection.name 
        //, partitionKey : ["/data"] 
       } 

       client.createCollection(databaseUrl, reqOptions, colOptions, (err, created) => { 
        if (err) { 
         console.log(err); 
         def.reject(err) 
        } else { 
         def.resolve(created); 
        } 
       }); 
      } else { 
       console.log(err); 
       def.reject(err); 
      } 
     } else { 
      def.resolve(result); 
     } 
    }); 

    return def.promise; 
} 

(イムはまだそれが動作するように取得しようと、コードだらしを無視してください)

私はこれを実行すると、あなたが私を上から見ることができるように、私はこのエラーに

.......... working with collection: testCollection 
getting collection: dbs/testDb/colls/testCollection 
collection testCollection not found... creating... 
{ code: 400, 
    body: '{"code":"BadRequest","message":"Message: {\\"Errors\\":[\\"x-ms-documentdb-partitionkey header cannot be specified for this request\\"]}\\r\\nActivityId: (snip), Request URI: /apps/(snip)/services/(snip)/partitions/(snip)/replicas/(snip)"}', 
    activityId: '(snip)' } 

を取得していますパーティションキーを定義するためのオプションが異なり、すべて同じ結果を返します。

また、reqOptionsオブジェクトに含める必要があるキーをパーティション化していることを示しています(この例ではCreate Collection in Azure DocumentDB with Different Partition Modeをガイドとして使用しています)。私がそれをしたとき、私はこのエラーを受けました。

.......... working with collection: testCollection 
getting collection: dbs/testDb/colls/testCollection 
collection testCollection not found... creating... 
{ code: 400, 
    body: '{"code":"BadRequest","message":"The specified document collection is invalid.\\r\\nActivityId: (snip)"}', 
    activityId: '(snip)' } 

この時点で私は紛失しており、何か助けがあれば幸いです。

おかげ

+0

をあなたは 'collection.azureOptions.offerThroughput'で提供している値とは何ですか?それは2500未満ですか? –

+0

私は400で始めましたが、私が投稿した文書を読みました.1万を超えていなければなりませんでした。私は10,100を置いたが、値が高すぎるという別のエラーが出た。だから私は10,000を使用しています –

答えて

1

Cosmos DB REST API documentationが述べたように、パーティション・キーがオブジェクトとして指定され、リクエストボディに入れなければなりません。

ので、以下のようにコードを変更してください:

var colOptions = {}; 
colOptions.offerThroughput = collection.azureOptions.offerThroughput || 10000; //default is 10k 

var reqOptions = { 
    id: collection.name, 
    partitionKey : { paths: ["/data"], kind: "Hash" } 
} 

client.createCollection(databaseUrl, reqOptions, colOptions, (err, created) => { 
    if (err) { 
     console.log(err); 
     def.reject(err) 
    } else { 
     def.resolve(created); 
    } 
}); 
+0

ありがとう、私は助けになるドキュメンテーションのための2日間見ましたが、私はノードjsドキュメントに焦点を当てていた...時々あなたはソースに行く必要があります。私はそれを試してみましょう... –

関連する問題