我的藏品中有这些文件:
{_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运算符
答案 0 :(得分:5)
我不相信使用当前的文档结构,您可以通过使用聚合框架来实现所需的结果。如果您将域名存储在单独的字段中,那么它将变得微不足道:
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
}
]
答案 1 :(得分:0)
聚合框架
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},
]
}