我该如何编写查询/汇总信息以使我能够发送和接收消息的总数? 例如,“发件人”字段中存在A,并且“发件人”字段中的列表之一中也存在A,则应对其进行计数。
{ "_id" : 1, "from" : "A", "To" : [B,C,F], "message":"lorem ipsum" }
{ "_id" : 2, "from" : "B", "To" : [A] , "message":"lorem ipsum" }
{ "_id" : 3, "from" : "C", "To" : [A,E] , "message":"lorem ipsum"}
{ "_id" : 4, "from" : "D", "To" : [E] , "message":"lorem ipsum"}
{ "_id" : 6, "from" : "A", "To" : [E,B ], "message":"lorem ipsum" }
此示例的总数为3(A,B,C),D不计算在内,因为D仅发送了一条消息而没有收到任何消息
我已经能够有一个“发件人”字段的独特列表,然后展开“收件人”字段并得到另一个列表。但是现在,我只能将两种结果结合在一起。
答案 0 :(得分:1)
这个想法是将所有文档分组以得到2个数组,并得到交集 的数组。
db.collection.aggregate([
{
$group: {
_id: null,
froms: {
$addToSet: "$from"
},
tos: {
$push: "$To"
}
}
},
{
$addFields: {
tos: {
$reduce: {
input: "$tos",
initialValue: [],
in: {
$setUnion: [
"$$value",
"$$this"
]
}
}
}
}
},
{
$addFields: {
count: {
$size: {
$setIntersection: [
"$froms",
"$tos"
]
}
}
}
}
])
第一阶段汇总所有文档,并创建“收件人”和“发件人”的数组。
第二阶段只是减少'tos'数组,因为它将是第一阶段之后的数组。
第三个也是最后一个阶段将获取由“ tos”和“ froms”数组相交得到的数组大小。
您可以here对其进行测试