【问题标题】:MongoDB sort by array size with large number of documentsMongoDB按具有大量文档的数组大小排序
【发布时间】:2017-04-10 09:12:36
【问题描述】:

我有一个文章集合,其中存储了一个列表标签,如下所示:

    {
       id: 1,
       title: "Sample title"
       tags: ["tag1", "tag2", "tag3", "tag4"]
    }

为了将文章与用户的兴趣相匹配,我使用聚合“match”和“setIntersection” 计算用户兴趣和文章标签之间有多少共同标签,然后对它们进行排序以获得最佳匹配。

  db.article.aggregate([
            {
                "$match": {                    
                    {"tags": {"$in": ["tags", ["tag1", ..., "tag100"]}}        
                }
            },    
            {
                "$project": {
                    "tags_match": {
                        "$setIntersection": ["tags", ["tag1", ..., "tag100"]]
                    },
                }
            },
            {
                "$project": {
                    "tags_match_size": {
                        "$size": "$tags_match"
                    },
                }
            },
            {"$sort": {"tags_match_size" : 1}}
            { "$limit" : 40 }
            ]
            );

如果我在文章集合中有几百个文档,它就可以正常工作。现在我有大约100万篇文章,大约需要半个小时才能完成。

我无法为“tags_match_size”创建索引以使其运行得更快,因为它是聚合查询中的一个新字段。

如何使查询运行得更快? 谢谢。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    为标签字段创建索引。索引仅适用于第一个 $match。

    【讨论】:

    • 是的,我确实为标签字段创建了索引。我的查询将在没有排序“tags_match_size”的情况下快速运行,但我想获得最佳匹配,这就是我需要对“tags_match_size”进行排序的原因。谢谢
    猜你喜欢
    • 2021-04-24
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2012-09-21
    相关资源
    最近更新 更多