我正在做一个模拟酒店登记的应用程序,用户在其中注册了大量客户的数据。在这些数据中,我有这个:
{
"client_name" : "John Doe",
"client_id" : "xxxxxxxx"
...
"company" : "CocaCola",
"hotel_hq" : "New York",
"lodging_days" : 5,
...
}
该应用程序应具备的功能之一是显示公司所在的酒店总部列表,以及公司在每个总部使用的天数。
所以,我需要一个返回给我的查询:
{"company" : "CocaCola", "hotel_hq" : ["New York", "California", "Orlando"], "lodging_days" : [5, 10, 8]}
我带血汗流泪,这个问题:
db.clients.aggregate(
{
$group: {
_id: '$company',
hotel_hq : {$push:'$hotel_hq'},
lodging_days : {$push:'$lodging_days' }
}
})
这是我最接近的,因为这让我回答:
{"_id" : "CocaCola", "hotel_hq": ["New York", "New York", "California", "Orlando", "Orlando", "Orlando", "Orlando"], "lodging_days" : [5, 8, 10, 8, 9, 2, 3]}
酒店总部有时会重复,因为同一家公司的不同客户住在同一个总部,或者同一个客户不止一次。
显然,我可以将$push
更改为$addToSet
,但结果将是:
{"_id" : "CocaCola", "hotel_hq": ["New York", "California", "Orlando"], "lodging_days" : [5, 8, 10, 9, 2, 3]}
对于hotel_hq来说这很酷,但是对于住宿日没有,我尝试使用$sum
,但我不知道怎么说Mongo只能算出重复'hotel_hq'的'accommodation_days'。
答案 0 :(得分:0)
希望这有效..
db.test3.aggregate(
[
{
$group:{_id:{company:"$company",hotel_hq:"$hotel_hq"},
"Days":{$sum:"$lodging_days"}}
},
{
$group:{_id:"$company",hotel_hq:{$push:"$_id.hotel_hq"},
Days:{$push:"$Days"}}
}
]
)