私のケースを簡単に説明しようとしましょう。私はMongoDBの初心者です。私はCouchDBから離れて自分の選択肢を探そうとしています。
サンプル文書は、この(短縮、単純化された)ように見えることがあります。
{
exp: [
{
isCurrent: true,
name: 'Name 1'
},
{
isCurrent: false,
name: 'Name 2'
}
]
}
インデックスは次のようになります。
{
"exp.name":1,
"exp.foo":1,
"exp.bar":1
}, {
partialFilterExpression:{ "exp.isCurrent": {$eq: true}}
}
はい、「foo」と「バー」は冗長に見えるんが、彼ら私の現在のインデックスの一部であり、私は彼らが結果を歪めるとは思わない。
「現在の」「行」だけをインデックス化することです。今、私が次のようなクエリを使用した場合:
{$and:[{"exp.name":"Name 2"},{"exp.isCurrent":true}]}
...上記のドキュメントは依然としてクエリを満たしています。どうして?さらに重要なことは、私は自分がしたいことをどうすればいいのですか?それも可能ですか?見た目は単純ですGoogle BigQuery
は、同じレコードのフィールドに$and
を適用します(このシナリオではNOの結果を返します)。
また、私の "isCurrent:true"は常に[0]です。これを利用してクエリを正確かつ効率的に書くことはできますか?
残念ながら、私は多くの行を持っており、dbはシーケンシャルスキャンを行っていますので、私はテストできません。インデックスは明らかにクエリの要件を満たしていないためです。 "isCurrent = true"を持つ "exp"だけを含むように異なる方法でインデックスを作成する方法はありますか?私の現在の 'partialFilterExpression'は、私がやろうとしていることでは不十分と思われます。 – wpfwannabe
埋め込みドキュメントを返すだけですか?私はCouchbaseにマップリダクションがあることを知っています。たとえドキュメントが埋め込まれていても、ビューを生成してフラットにします。 mongodbがそれを手伝ってくれるかどうかは分かりません。おそらく、mongodbのmapreduce機能を見てください。 mongodbが3.0より新しい場合(2.xバージョンはデータベース全体をスキャンします)、$ elemMatchを使用したこの問合せでは、explain()機能を使用して問合せ中にどの索引が使用されているかを確認できます。 –