考虑这个测试集合,其中机场由AirportID
标识:
[
{ AirportID:"1001", delayMinutes :"15.0" },
{ AirportID:"1004", delayMinutes :"3.0" },
{ AirportID:"1001", delayMinutes :"20.0" },
{ AirportID:"1002", delayMinutes :"6.0" },
{ AirportID:"1002", delayMinutes :"25.0" },
{ AirportID:"1004", delayMinutes :"55.0" },
]
我想把它们组合在一起,列出列表中的前2个,条件是$delayMinutes
大于"10.0"。我想把它们组合在一起,列出列表中的前2个。
我试过的代码:
db.test.aggregate([
{
$group: {
_id: "$AirportID",
delayMinutes: {
$sum: {
"$toDouble": "$delayMinutes"
}
}
}
},
{
$sort: {
delayMinutes: -1
}
},
{
$limit: 2
}
])
随着需求的明确
首先需要过滤文档delayMinutes
场大于($gt
) 10.
请确保在比较之前将delayMinutes
转换为double
。
db.collection.aggregate([
{
$match: {
$expr: {
$gt: [
{
"$toDouble": "$delayMinutes"
},
10
]
}
}
},
{
$group: {
_id: "$AirportID",
delayMinutes: {
$sum: {
"$toDouble": "$delayMinutes"
}
}
}
},
{
$sort: {
delayMinutes: -1
}
},
{
$limit: 2
}
])
Mongo Playground示例
您可以将delayMinutes
字段更新为$set
阶段的double。因为在$match
和$group
阶段是冗余的。
db.collection.aggregate([
{
$set: {
delayMinutes: {
"$toDouble": "$delayMinutes"
}
}
},
{
$match: {
$expr: {
$gt: [
"$delayMinutes",
10
]
}
}
},
{
$group: {
_id: "$AirportID",
delayMinutes: {
$sum: "$delayMinutes"
}
}
},
{
$sort: {
delayMinutes: -1
}
},
{
$limit: 2
}
])
Mongo Playground示例(含$set
)