当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《按MongoDB中的子字符串对值进行分组》经验,为你挑选了1个好方法。

我在我的收藏中有这些文件:

{_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运算符



1> Dmytro Shevc..:
聚合框架

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

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

使用简单的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
    }
]

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有