これには完全に困惑しました。私のデータベースにはuserTags
、次のようなオブジェクトであるというフィールドを含むドキュメントがあるとします。
{
name: 'obj1',
userTags: {
"foo" : 5,
"bar" : 30,
"aaa" : 15,
"bbb" : 21,
"ccc" : 23
}
}
フィールドをクエリするときはuserTags
、特定のユーザーが提供するタグに基づいて実行したいと考えています。たとえば、ユーザーは自分のアカウントに次のタグを持っている可能性があります。
var tagsToMatch = {
"foo" : 44,
"bar" : 18,
"aaa" : 45,
"bbb" : 10,
"ggg" : 5,
"mmm" : 90
}
これらのタグの例はすべて任意であることに注意してください。検索には 2 つのタグを含めることができ、5,000 のタグを含めることができます。すべてユーザー定義であり、残念ながら私が実際に制御できるものではありません。上位 5 ~ 10 個のタグを除くすべてのタグをカットするスクリプトを作成することもできますが、それよりも低くしたくはありません。
現時点ではsort()
、最もカウントされたタグに基づいて機能を実行しています。
{'userTags.aaa': -1, 'userTags.foo': -1, 'userTags.bar': -1, 'userTags.bbb': -1, 'userTags.ccc': -1}
これはほとんどの場合機能しますが、問題のユーザーに合わせてもう少し調整したい. たとえば、ユーザーの観点からは は とほぼ同じくらい重要ですが、aaa
に重みを与えることなく、 の順に結果を吐き出します。 foo
foo
aaa
地理空間インデックス作成は、断然最良の選択肢のようです。ただし、ここには 2 つの大きな問題があります。
- これらはユーザー定義であり、何千もあり、絶えず変化しているため、私
ensureIndex
にはできません。userTags.[tagname]
- 私が見る限り、地理空間インデックスは 2 次元でしか機能しません。
ここでのオプションは何ですか? Mongo の地理空間機能を使用したことがないので、ポイントを完全に見逃している可能性がありますuserTags
。全体としてインデックスを作成し、含まれているタグで地理空間検索を実行できますか?