web-dev-qa-db-ja.com

ComosDB-MongoAPI-ドキュメントにシャードキーが含まれていません

CosmosDB(以前のDocumentDB)を使用して調査していますが、現在はMongoDBを使用しているため、CosmosDBにMongoAPIを使用しようとしています。

AzureでCosmosDBデプロイメントを作成し、コレクションを作成して、「/ rateId」のパーティションキーを指定しました。

Microsoftのドキュメント から理解できる限り、このパーティションキーは、挿入する各ドキュメントのプロパティに関連している必要があるため、次のような基本的なドキュメントを挿入しようとしています。

{
    "rateId": "test.1",
    "val": "test2"
}

ただし、これを(Mongo C#ドライバーまたはMongoChefを介して)挿入しようとすると、「ドキュメントにシャードキーが含まれていません」というエラーが表示されます。

enter image description here

私はこれを私が考えることができるあらゆる方法で試しました、そして私がこのエラーで否定されるたびに。これがどのように機能するのか、または何か間違ったことをしているのか誤解していますか?

9
QTom

ドキュメント内 Microsoftは、mongoシェルを介してコレクションを作成するためにこのコマンドを使用すると言います

db.runCommand( { shardCollection: "myDb.myCollection", key: { rateId: "hashed" } } )

これを使用してコレクションを作成しましたが、期待どおりに機能するようになりました(rateIdプロパティを持つドキュメントは「シャードキーがありません」というエラーが発生することなく、OKを挿入します)。

Azure Portalでコレクションを見ると、シャードキーが次のように表示されます。

$v.rateId.$v

ポータルを介してコレクションを作成し、パーティションとして/ rateIdを指定した場合、それは

rateId

少なくとも今は進むことができますが、なぜこのように動作するのか、またはこれが意図されているのか混乱しています(ドキュメントにこの「$ v」形式についての言及はありません)

4
QTom

エスケープ文字で遊ぶことで、azcliを使用してpartition-key-pathを作成する方法を見つけることができました。

AZCLIバージョン2.0.59を使用

$paritionKeyPath = '/''$v''' + $path + '/''$v'''
az cosmosdb collection create .... --partition-key-path $partitionKeyPath

ここで、pathは、スラッシュで始まるドキュメント内のパスです(つまり、「/ foo」)。

ところで:これは以前のAZ CLIバージョンで機能するはずです(参照: https://github.com/Azure/azure-cli/issues/86

1
Tomasz K

ここで説明したさまざまな方法でコレクションを作成して、問題を解決しようとしました。私の場合、残念ながら何も助けにはなりませんでした。最終的に私はこのサンプルを変更しました https://github.com/Azure-Samples/Azure-cosmos-db-mongodb-dotnet-getting-started 挿入時にcollectonを自動的に作成しました。

0
Daniil Grankin

この問題は、ドキュメントに値を挿入するときにシャードキーの値を入力するのを忘れた場合に発生します。これは、ドキュメントのシャードキーを宣言すると、挿入するモデルの一部になるはずであることを意味します。以下の画像をご参照ください。

enter image description here

0
Sachin Kalia

私はここで同じエラーメッセージを表示することになりました。 Azure CosmosDB、MongoDBapi。

Azure CLIを使用してコレクションを作成すると、エラーが発生します。

一方、受け入れられた回答(db.runCommand( { shardCollection: "myDb.myCollection", key: { rateId: "hashed" } } ))に記載されているコマンドを使用してコレクションを作成すると、エラーはなくなります。

これは、パーティション化されたキーを使用してコレクションをプロビジョニングするには、次のことを行う必要があることを意味します。

  1. ドットで区切られたパーティションキーパスを指定して、MongoDBを介してコレクションを作成します(例:sender.postCode
  2. aZ CLIを使用して、必要なスループットで更新します

いずれにせよ、パーティショニングは常にAzureのポータルから機能しているようです。

$vここで言及されているプレフィックスは、もは​​やどこにも存在しません。

0