【问题标题】:mongodb fast tags querymongodb快速标签查询
【发布时间】:2014-09-29 18:37:47
【问题描述】:

我有一个非常大的集合(超过 800k),我需要实现一个基于标签的自动完成(仅基于单词开头)功能的查询。我的文档如下所示:

 {
    "_id": "theid",
    "somefield": "some value",
    "tags": [
        {
            "name": "abc tag1",
            "vote": 5
        },
        {
            "name": "hij tag2",
            "vote": 22
        },
        {
            "name": "abc tag3",
            "vote": 5
        },
        {
            "name": "hij tag4",
            "vote": 77
        }
    ]
}

例如,如果我的查询将针对所有以“ab”开头并且具有“somefield”即“some value”的标签,则结果将是“abc tag1”、“abc tag3”(仅名称)。 我更关心查询的速度,而不是插入和更新的速度。

我认为聚合框架是正确的方法,但是对于非常快速的查询来说,最好的管道和索引是什么?

文档不是“标签”文档,它们是代表客户端对象的文档,它们包含更多数据字段,我为简单起见省略了这些字段,每个客户端都有多个标签和另一个字段(我更改了它的名称,因此不会混淆带有标签数组)。我需要获得一组客户拥有的所有标签不重复的集合。

【问题讨论】:

  • 我去年尝试做类似的事情,但数据库要小得多。随着数据量的增长,我最终不得不使用 Solr。
  • 您可以发布您尝试过的查询和索引吗?你用过聚合框架吗?
  • 对不起,代码早已不复存在,但它是基于标签字段上的正则表达式。它早于聚合框架,但我不确定这是否是最好的方法。根据我的经验,聚合框架喜欢将整个文档读入内存,即使 $match 可以仅使用索引来完成

标签: mongodb mongodb-query mongodb-indexes


【解决方案1】:

您的文档结构没有意义 - 我假设 tags 是一个数组而不是一个对象。试试这样的查询

db.tags.find({ "somefield" : "some value", "tags.name" : /^abc/ })

{ "maintag" : 1, "tags.name" : 1 } 上有一个索引。 MongoDB 将左锚正则表达式查询优化为范围查询,可以使用索引有效地完成(参见$regex docs)。

您可以使用聚合管道从该文档结构中获取标签:

db.tags.aggregate([
    { "$match" : { "somefield" : "some value", "tags.name" : /^abc/ } },
    { "$unwind" : "$tags" },
    { "$match" : { "tags.name" : /^abc/ } },
    { "$project" : { "_id" : 0, "tag_name" : "$tags.name" } }
])

索引仅对第一个 $match 有帮助,因此管道的索引与查询的索引相同。

【讨论】:

  • 你说得对,我的对象有错误,我修复了它。您的查询将返回所有符合条件的文档,我只需要一个符合条件且不重复的标签列表。否则我会获取一些不必要的数据。
  • $ 位置运算符可以投影出 1 个匹配的标签。如果您确实需要返回所有标签,那么您的文档结构不恰当。文档应该是带有非规范化主标签的标签,而不是带有附加标签的主标签文档。
  • 我想我的问题并不清楚,请参阅我的编辑。它不是一个标签文档,它是一个带有嵌套的士气低落的标签数组的客户文档。
  • 同样的事情 - 查询返回文档,而不是嵌入对象。您应该将您希望查询返回的内容插入到数据库中。对于罕见的事情,使用聚合。这可能是一个更罕见的查询,所以我用如何使用聚合来获取标签更新了答案。
  • 感谢这项工作,但这是否可以扩展到超过 800k 的文档?我需要这个来输入自动完成,在你看来它足够快吗?索引应该在 tags 还是 tags.name 上?
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 2019-06-25
  • 2011-05-03
相关资源
最近更新 更多