インデックスを作成するフィールドの 1 つに特定の値がある場合にのみ、コレクションの一部のドキュメントをインデックスに登録することはできますか?
例を挙げて説明しましょう:
コレクション「posts」には何百万ものドキュメントがあり、すべて次のように定義されています。
{ "ネットワーク": "network_1", "ブログ名": "ブログ名_1", "post_id": 1234, "post_slug": "abcdefg" }
投稿の分布が network_1 と network_2 で均等に分割されていると仮定しましょう
私のアプリケーションは、「ネットワーク」の値に基づいてクエリのタイプを選択することがよくあります (ただし、両方のネットワークからのデータが必要になる場合もあります)。
例えば:
www.test.it/network_1/blog_1/**postid**/1234/
-> db.posts.find ({network: "network_1" blogname "blog_1", post_id: 1234})
www.test.it/network_2/blog_4/**slug**/aaaa/
-> db.posts.find ({network: "network_2" blogname "blog_4" post_slug: "yyyy"})
2 つの個別のインデックス (network / blogname / post_id および network / blogname / post_slug) を作成することもできますが、インデックス内のデータの 50% がまったく使用されないため、RAM を大量に浪費することになります。
「フィルタリングされた」インデックスを作成する方法はありますか?
例: (WHERE パラメータに注意してください)
db.posts.ensureIndex ({network: 1 blogname: 1, post_id: 1}, {where: {network: "network_1"}})
db.posts.ensureIndex ({network: 1 blogname: 1, post_slug: 1}, {where: {network: "network_2"}})