按 $group 聚合记录 - 条件 1 或条件 2
Aggregating records by $group - condition 1 or condition 2
我有一个包含大约 5 万条“公司”记录的数据库。
我想通过匹配找到重复项:
name
和 street
个字段。
或
phone
字段
(我认为#1 和#2 都是唯一标识符,因此两者都可用于查找重复项。)
我可以编写 $group 语句来匹配基于 #1:
_id: {
name: '$name',
street: 'street'
},
uniqueIds: {
$addToSet: '$_id'
},
count: {
$sum: 1
}
我试过这样的事情来匹配一个或另一个:
_id: {
$or: [
{name: '$name', street: '$street'},
{phone: '$phone}
]
}...
但这只是 returns 一个布尔值。
如何在同一聚合中通过过滤上面的 #1 或 #2 进行分组?
一种选择是使用 $facet:
db.company.aggregate([
{ $facet:{
by_name_street:[ {$group:{ _id:{n:"$name",str:"$street" }, cnt:{$sum:1} }} ] ,
by_phone:[ {$group:{ _id:"$phone" , cnt:{$sum:1} }} ]
} }
])
我有一个包含大约 5 万条“公司”记录的数据库。
我想通过匹配找到重复项:
name
和street
个字段。
或
phone
字段
(我认为#1 和#2 都是唯一标识符,因此两者都可用于查找重复项。)
我可以编写 $group 语句来匹配基于 #1:
_id: {
name: '$name',
street: 'street'
},
uniqueIds: {
$addToSet: '$_id'
},
count: {
$sum: 1
}
我试过这样的事情来匹配一个或另一个:
_id: {
$or: [
{name: '$name', street: '$street'},
{phone: '$phone}
]
}...
但这只是 returns 一个布尔值。
如何在同一聚合中通过过滤上面的 #1 或 #2 进行分组?
一种选择是使用 $facet:
db.company.aggregate([
{ $facet:{
by_name_street:[ {$group:{ _id:{n:"$name",str:"$street" }, cnt:{$sum:1} }} ] ,
by_phone:[ {$group:{ _id:"$phone" , cnt:{$sum:1} }} ]
} }
])