MongoDB聚合和分组性能问题

时间:2019-04-05 14:07:37

标签: mongodb aggregation-framework pymongo

在具有16GB RAM的Centos7服务器上运行MongoDB 4。通过pymongo驱动程序与Mongo接口。目前有大约60万个文档正在收集中。

我的收藏文档如下:

{
    _metadata: {
        parent_name: <str_val>
        document_name: <str_val>
        datetime: <datetime object (indexed)>
        revision: <int>,
        first_name: <str>,
        last_name: <str>,
        other fields...
    }
    tag1: <val>
    tag2: <val>
    ...
}

(_ metadata.document_name,_metadata.revision,_metadata.parent_name)上有一个复合索引,要求组合必须唯一。

我正在尝试运行一个汇总查询,按exam_id和修订版分组,以使最终文档如下所示:

{
    parent_name: <val>
    docu_revision_pairs: [[<revision>, <document_name>], ...]
    first_name: <val>
    last_name: <val>
    <other fields from _metadata>
 }

我想按日期时间对文档进行排序。

我正在运行的查询是:

[
        {
            "$match": {},
        },
        {
            "$sort": {
                "$_metadata.datetime": -1
            }
        },
        {
            "$group":
            {
                "_id": {"parent_name": "$_metadata.parent_name"},
                "revision": {"$push": "$_metadata.revision"},
                "document_name": {"$push": "$_metadata.document_name"},
                "first_name": {"$first": "$_metadata.first_name"},
                "last_name": {"$first": "$_metadata.last_name"},
                "datetime": {"$first": "$_metadata.datetime"},
                <other fields from _metadata>
            }
        },
        {
            "$project":
            {
                "docu_revision_pairs": {
                    "$zip": {
                        "inputs": ["$revision", "$document_name"]
                    }
                },
                "_id": 0,
                "parent_name": "$_id.parent_name",
                "first_name": 1,
                "last_name": 1,
                "datetime": 1,
                <other fields from _metadata>: 1
            }
        },
        {
            "$skip": page_size*(page_num - 1),
        },
        {
            "$limit": page_size,
        }
    ]

当前正在尝试对整个集合执行“默认”查询,但是大约需要10-15秒才能给出答案,而这是在我重复类似的查询以获取文件计数之后$ group阶段,以便我可以正确地对结果进行分页。

在使用中,查询将与标记为的字段进行匹配。

在默认情况下,是否有更好的方法来执行此查询?将更多字段编入索引或将元数据字段用作顶级帮助吗?

1 个答案:

答案 0 :(得分:0)

如果您通过metadata.datetime进行索引并按照查询中希望的方式对其进行排序,则可能会加快速度