我有一个名为test的mongodb集合,数据长这样 -
{
"_id" : ObjectId("5dd271d30c90441941eb92b1"),
"h_id" : NumberInt(1),
"ota" : NumberInt(1),
"search_date" : ISODate("2019-09-09T00:00:00.000+0000"),
"data" : [{
"price" : NumberInt(12500),
"code" : "02246933",
}
{
"price" : NumberInt(11500),
"code" : "02246934",
}
{
"price" : NumberInt(13500),
"code" : "02246935",
}
{
"price" : NumberInt(14500),
"code" : "02246936",
}]
}
{
"_id" : ObjectId("5dd271d30c90441941eb92b2"),
"h_id" : NumberInt(1),
"ota" : NumberInt(1),
"search_date" : ISODate("2019-09-10T00:00:00.000+0000"),
"data" : [{
"price" : NumberInt(2500),
"code" : "102246933",
}
{
"price" : NumberInt(1500),
"code" : "102246934",
}
{
"price" : NumberInt(3500),
"code" : "102246935",
}
{
"price" : NumberInt(4500),
"code" : "102246936",
}]
}
我想写一个查询,它能够给出像这样的结果 -
{
"h_id" : NumberInt(1),
"ota_group": [{
"ota": NumberInt(1),
"search_date_group": [{
"search_date": ISODate("2019-09-09T00:00:00.000+0000"),
"min_price": NumberInt(11500),
"min_code": "02246934",
"max_price": NumberInt(14500),
"max_code": "02246936"
},
{
"search_date": ISODate("2019-09-10T00:00:00.000+0000"),
"min_price": NumberInt(1500),
"min_code": "102246934",
"max_price": NumberInt(4500),
"max_code": "102246936"
}]
}]
}
{
"h_id" : NumberInt(2),
"ota_group": [{
"ota": NumberInt(1),
"search_date_group": [{
"search_date": ISODate("2019-09-09T00:00:00.000+0000"),
"min_price": NumberInt(11500),
"min_code": "02246934",
"max_price": NumberInt(14500),
"max_code": "02246936"
},
{
"search_date": ISODate("2019-09-10T00:00:00.000+0000"),
"min_price": NumberInt(1500),
"min_code": "102246934",
"max_price": NumberInt(4500),
"max_code": "102246936"
}]
}]
}
目标: 我想使用 h_id 对文档进行分组,然后再使用 ota 对每个子组进行分组。进一步地,这些子子组应该使用 search_date 进行分组。对于每个 search_date,我需要 max_price、max_code 和 min_price、min_code。
据我理解,我需要执行多个(嵌套)group by 才能实现这个结果。
我是 Mongodb 的新用户,尝试编写查询语句:
db.test.aggregate(
[
{
"$match": {
'h_id': 1
},
{ "$unwind": "$data" },
{ "$group":
{
'_id': '$_id',
'h_id': { $first: "$h_id" },
'ota': { $first: "$ota" },
'search_date': { $first: "$search_date" },
'min_price': {
'$min': "$data.price",
},
'min_price': {
'$min': "$data.price"
},
'max_price': {
'$max': "$data.price"
},
'max_price': {
'$max': "$data.price"
}
}
},
{ "$group":
{
'_id': {h_id: "$h_id"},
'info': { $push: { 'search_date': "$search_date", 'ota': "$ota", 'min_price': "$min_price", 'max_price': "$max_price", 'min_price': "$min_price", 'max_price': "$max_price" } }
}
},
{ "$group":
{
'_id': "$_id.h_id",
'info': { $first: "$info" },
}
},
]);
但这远远不够满足需求。 有人能给出一些提示/想法如何实现吗?