0

完全被这个难住了。假设我的数据库中包含一个名为 的字段的文档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,它几乎与. foofooaaa

到目前为止,地理空间索引似乎是最好的选择。但是,我在这里有两个主要问题:

  1. 我不能ensureIndex继续,userTags.[tagname]因为这些是用户定义的,它们有数千个,而且它们在不断变化。
  2. 据我所知,地理空间索引仅适用于二维。

我在这里有什么选择?我从未使用过 Mongo 的地理空间功能,所以我可能完全忽略了这一点,我可以将索引userTags作为一个整体并对其包含的标签运行地理空间搜索吗?

4

1 回答 1

0

如果我理解正确,您将创建一个自定义标签云。

我建议您将存储方案更改为更适合给定问题

收藏:

  db.users {
    name:"username",
    tag:["tag_value1", "tag_value2", ...]
  }
  db.tags {
    tag: "tag_value1",
    cnt: 1,
    user:"username"
  }

特定用户的更新/插入标签将是:

db.users.update({user:'user1', tags:{$in:['tag1']}}, {'$addToSet':{tag:'tag1'}}, {upsert:1})
db.tags.update({user:'user1', tag:'tag1'}, {$inc:{cnt:1}}, {upsert:1})

如果您没有用户,则将使用特定标签创建此用户 如果您没有标签,则将创建此标签或更新特定用户的标签计数,在标签数组中将仅插入唯一标签

每个用户的标签数组可能是很好的索引;)

之后的查询将很简单:

db.tags.find({user:"user1"}, {tags:1, _id:0}).sort({cnt:-1})

或者您可以使用聚合框架进行更复杂的查询,例如按用户分组的查询

于 2013-12-13T12:43:21.890 回答