完全被这个难住了。假设我的数据库中包含一个名为 的字段的文档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
到目前为止,地理空间索引似乎是最好的选择。但是,我在这里有两个主要问题:
- 我不能
ensureIndex
继续,userTags.[tagname]
因为这些是用户定义的,它们有数千个,而且它们在不断变化。 - 据我所知,地理空间索引仅适用于二维。
我在这里有什么选择?我从未使用过 Mongo 的地理空间功能,所以我可能完全忽略了这一点,我可以将索引userTags
作为一个整体并对其包含的标签运行地理空间搜索吗?