説明を投稿していただきありがとうございます。一度に1つずつ問題に対処しましょう。
まず、このクエリは、あなたが思っていることや実行したいことを実行するとは思いません。例として、mongoシェルを使用して説明します。シェルに翻訳されたクエリは
{ "$or" : [
{ "$and" : [
{ "SearchTerms.Key" : "ClientId" },
{ "SearchTerms.Value" : "xxx" }
]},
{ "$and" : [
{ "SearchTerms.Key" : "CustomerName" },
{ "SearchTerms.Value" : "Jan" }
]}
]}
このクエリは、Key
のいずれかが含まれるドキュメントを検索します 値は「ClientId」で、いくつかのValue
値が「xxx」またはKey
値は「CustomerName」で、Value
がいくつかあります。 値「Jan」。 キーと値は同じ配列要素の一部である必要はありません 。たとえば、次のドキュメントはクエリと一致します
{ "SearchTerms" : [
{ "Key" : "ClientId", "Value" : 691 },
{ "Key" : "banana", "Value" : "xxx" }
]
}
Key
を含むドキュメントと完全に一致することが望ましい動作だと思います およびValue
同じ配列要素内。 $elemMatch
演算子は仕事のためのツールです:
{ "$or" : [
{ "SearchTerms" : { "$elemMatch" : { "Key" : "ClientId", "Value" : "xxx" } } },
{ "SearchTerms" : { "$elemMatch" : { "Key" : "CustomerName", "Value" : "Jan" } } }
]}
第二に、私はこのスキーマがあなたが探しているものではないと思います。ユースケースについて説明していないため、自信が持てませんが、そのブログ投稿で説明されている状況は、任意ので保存および検索する必要がある非常にまれな状況です。 あるドキュメントから次のドキュメントに変更できるキーと値のペア。これは、ユーザーがカスタムメタデータを入力できるようにするようなものです。これを実行する必要のあるアプリケーションはほとんどありません。アプリケーションは、おそらく内部システムのために、顧客に関する情報を保存しているようです。 データモデル を定義できるはずです。 のように見えるあなたの顧客のために
{
"CustomerId" : 1234,
"CustomerName" : "Jan",
"ClientId" : "xpj1234",
...
}
これにより、物事が劇的に簡素化および改善されます。時々人々がMongoDBを「スキーマレス」と呼び、ブログ投稿が「スキーマレス」ドキュメントについて話しているので、ここでワイヤーが交差したと思います。ブログの投稿は、実際には、そこに何が入るのかわからないスキーマレスドキュメントについて話している。ほとんどのアプリケーションは、コレクション内のドキュメントの一般的な構造がどのようなものになるかをほぼ正確に知っている必要があります。
最後に、これに基づいて、今のところ遅いクエリの問題を無視できると思います。さらにヘルプが必要な場合、またはここで述べたことを考慮しても問題が解決しない場合は、別の質問をするか、追加の説明を付けてこの質問を編集してください。