在MongoDB中按子字符串对值进行分组



我的收藏中有以下文档:

{_id: "aaaaaaaa", email: "mail1@orange.fr"},
{_id: "bbbbbbbb", email: "mail2@orange.fr"},
{_id: "cccccccc", email: "mail3@orange.fr"},
{_id: "dddddddd", email: "mail4@gmail.com"},
{_id: "eeeeeeee", email: "mail5@gmail.com"},
{_id: "ffffffff", email: "mail6@yahoo.com"}

我想要这个结果:

{
    result: [
        {domain: "orange.fr", count: 3},
        {domain: "gmail.com", count: 2},
        {domain: "yahoo.com", count: 1},
    ]
}

我不确定您是否可以使用聚合器和$regex运算符

聚合框架

我不相信使用目前的文档结构,您可以通过使用聚合框架来实现所需的结果。如果您将域名存储在一个单独的字段中,它将变得微不足道:

db.items.aggregate(
{
    $group:
    {
        _id: "$emailDomain",
        count: { $sum: 1 }
    },
}
)

Map Reduce

使用简单的映射减少聚合可以实现您想要的内容。当然,大型收藏品的性能不会很好。

查询

db.emails.mapReduce(
    function() {
        if (this.email) {
            var parts = this.email.split('@');
            emit(parts[parts.length - 1], 1);
        }
    },
    function(key, values) {
        return Array.sum(values);
    },
    {
        out: { inline: 1 }
    }
)

输出

[
    {
        "_id" : "gmail.com",
        "value" : 2
    },
    {
        "_id" : "yahoo.com",
        "value" : 1
    },
    {
        "_id" : "orange.fr",
        "value" : 3
    }
]

聚合框架

MongoDB 3.4(2016年11月29日发布)聚合框架中的onword有很多方法

[
    {
        $project: {
            domain: {
                $substr: ["$email", {
                    $indexOfBytes: ["$email", "@"]
                }, {
                    $strLenBytes: "$email"
                }]
            }
    }, 
    {
        $group: {
            _id: '$domain',
            count: {
                $sum: 1
            }
        }
    },
    {
        $sort: {
            'count': -1
        }
    }, 
    {
        $group: {
            _id: null,
            result: {
                $push: {
                    'domain': "$_id",
                    'count': '$count'
                }
            }
        }
    }
]

结果

{
    _id: null,
    result: [
        {domain: "@orange.fr", count: 3},
        {domain: "@gmail.com", count: 2},
        {domain: "@yahoo.com", count: 1},
    ]
}

相关内容

  • 没有找到相关文章