我需要使用以下集合的架构执行求和:
{
"_id" : "20160530/108107/31",
"metadata" : {
"date" : "2016-05-30",
"offer" : "108107",
"adv" : 31,
"update" : ISODate("2016-05-30T15:27:20.240Z")
},
"daily_unique" : 4,
"daily_gross" : 4,
"hourly" : {
"17" : {
"unique" : 4,
"gross" : 4
}
},
"publisher" : {
"738" : {
"daily_unique" : 3,
"daily_gross" : 3,
"hourly" : {
"17" : {
"unique" : 3,
"gross" : 3
}
}
},
"43" : {
"daily_unique" : 1,
"daily_gross" : 1,
"hourly" : {
"17" : {
"unique" : 1,
"gross" : 1
}
}
}
}
},
{
"_id" : "20160530/78220/59",
"metadata" : {
"date" : "2016-05-30",
"offer" : "78220",
"adv" : 59,
"update" : ISODate("2016-05-30T15:24:49.900Z")
},
"daily_unique" : 2,
"daily_gross" : 2,
"hourly" : {
"17" : {
"unique" : 2,
"gross" : 2)
}
},
"publisher" : {
"43" : {
"daily_unique" : 2,
"daily_gross" : 2,
"hourly" : {
"17" : {
"unique" : 2,
"gross" : 2
}
}
}
}
}
第一个文档包含来自发布者738和43的数据,但第二个文档仅包含来自43的数据。 因此,当我想要总结来自发布者738的所有数据时,我需要将所有daily_gross或daily_unique相加,只有它出现在发布者中时,如第一个文档中那样。
我正在尝试一些不同的方法,使用$ exists和$ cond,但没有得到结果
aggregate(
['$match' => ['metadata.date' => date('Y-m-d')]],
['$group' => [
'_id' => '$metadata.offer',
'daily_u' => ['$sum' => '$daily_unique']
],
])
给了我
[
0 => [
'_id' => '108107'
'daily_u' => 4
]
1 => [
'_id' => '78220'
'daily_u' => 2
]
]
当我尝试深入了解出版商时,我无法得到我想要的结果:
aggregate(
['$match' => ['metadata.date' => date('Y-m-d')]],
['$group' => [
'_id' => '$metadata.offer',
'daily_u' => [
'$sum' => [
'$cond' => [
'if' => [
'publisher.738' => ['$exists' => true],
'then' => 1,
'else' => 0
]
]
]
],
]]
)
但是出版商无法每天获得。 当我尝试获取每小时数据时,它甚至变得复杂。 任何人都能指出我正确的方向吗? 提前谢谢。