MongoDB Select MIN/MAX 来自数组中的值
MongoDB Select MIN/MAX from values inside Array
所以我在执行查询时遇到问题 return 数组字段内的字段只有两个值,MIN 和 MAX...
client.files.uploads
是我要获取的字段 MIN/MAX.
例如,结果将只是“0,10
”,我不想获取更多字段,只需查看每个 client.files.uploads
字段并获取整个 MIN/MAX 上传client
集合有,但是return 只有最低值和最高值不是每个客户的一行。
这是我的查询,但没有得到我想要的...
db.client.aggregate([
{$unwind: "$files"},
{
$group: {
_id : "$_id",
data_min: {$min: "$files.uploads"},
data_max: {$max: "$files.uploads"}
}
},
{
$project:{
data_min: "$min",
data_max: "$max",
}
}
],{allowDiskUse:true})
更新:
我已经设法做到了我想做的事,但问题仍然悬而未决,因为我不认为我的方式是实现它的最佳方式...
db.clients.aggregate([
{$unwind: "$files"},
{
$group: {
_id: "$_id",
data_min: {$min: "$files.uploads"},
data_max: {$max: "$files.uploads"}
}
},
{
$group: {
_id: "1",
min: {$min: "$data_min"},
max: {$max: "$data_max"}
}
},
{
$project: {
_id: 0,
min: 1,
max: 1
}
}
],
{
allowDiskUse: true
})
这个查询 return 只给我一行,整个集合的最低值和最高值,这就是我想要的。
这是我文档的示例数据
[
{
"name": "John",
"files": [
{
"uploads": 9685,
"downloads": 83,
},
{
"uploads": 1,
"downloads": 833
},
{
"uploads": 676,
"downloads": 823
}
]
},
{
"name": "Peter",
"files": [
{
"uploads": 32,
"downloads": 99
},
{
"uploads": 34,
"downloads": 4
}
]
},
{
"name": "Mery",
"files": [
{
"uploads": 3,
"downloads": 244
},
{
"uploads": 15,
"downloads": 543
},
{
"uploads": 1345,
"downloads": 22
},
{
"uploads": 6743,
"downloads": 87543
}
]
}
]
你的预测是错误的。您正在使用 accumulator operator 作为值。将您的投影更改为:
{
$project:{
_id: 0,
data_min: 1,
data_max: 1
}
}
检查这个聚合查询
db.clients.aggregate({"$unwind": "$files"},
{"$project":{"name":"$name","files":"$files"}},
{"$group":{"_id":"$_id","max":{"$max":"$files"},
"min":{"$min":"$files"}}
}).pretty()
或如下使用$project
db.clients.aggregate({"$unwind": "$files"},
{"$project":{"name":"$name","files":"$files"}},
{"$group":{"_id":"$_id","max":{"$max":"$files"},
"min":{"$min":"$files"}}},
{"$project":{"max_upload":"$max.uploads",
"max_download":"$max.downloads",
"min_upload":"$min.uploads",
"min_downloads":"$min.downloads","_id":0
}
})
所以我在执行查询时遇到问题 return 数组字段内的字段只有两个值,MIN 和 MAX...
client.files.uploads
是我要获取的字段 MIN/MAX.
例如,结果将只是“0,10
”,我不想获取更多字段,只需查看每个 client.files.uploads
字段并获取整个 MIN/MAX 上传client
集合有,但是return 只有最低值和最高值不是每个客户的一行。
这是我的查询,但没有得到我想要的...
db.client.aggregate([
{$unwind: "$files"},
{
$group: {
_id : "$_id",
data_min: {$min: "$files.uploads"},
data_max: {$max: "$files.uploads"}
}
},
{
$project:{
data_min: "$min",
data_max: "$max",
}
}
],{allowDiskUse:true})
更新:
我已经设法做到了我想做的事,但问题仍然悬而未决,因为我不认为我的方式是实现它的最佳方式...
db.clients.aggregate([
{$unwind: "$files"},
{
$group: {
_id: "$_id",
data_min: {$min: "$files.uploads"},
data_max: {$max: "$files.uploads"}
}
},
{
$group: {
_id: "1",
min: {$min: "$data_min"},
max: {$max: "$data_max"}
}
},
{
$project: {
_id: 0,
min: 1,
max: 1
}
}
],
{
allowDiskUse: true
})
这个查询 return 只给我一行,整个集合的最低值和最高值,这就是我想要的。
这是我文档的示例数据
[
{
"name": "John",
"files": [
{
"uploads": 9685,
"downloads": 83,
},
{
"uploads": 1,
"downloads": 833
},
{
"uploads": 676,
"downloads": 823
}
]
},
{
"name": "Peter",
"files": [
{
"uploads": 32,
"downloads": 99
},
{
"uploads": 34,
"downloads": 4
}
]
},
{
"name": "Mery",
"files": [
{
"uploads": 3,
"downloads": 244
},
{
"uploads": 15,
"downloads": 543
},
{
"uploads": 1345,
"downloads": 22
},
{
"uploads": 6743,
"downloads": 87543
}
]
}
]
你的预测是错误的。您正在使用 accumulator operator 作为值。将您的投影更改为:
{
$project:{
_id: 0,
data_min: 1,
data_max: 1
}
}
检查这个聚合查询
db.clients.aggregate({"$unwind": "$files"},
{"$project":{"name":"$name","files":"$files"}},
{"$group":{"_id":"$_id","max":{"$max":"$files"},
"min":{"$min":"$files"}}
}).pretty()
或如下使用$project
db.clients.aggregate({"$unwind": "$files"},
{"$project":{"name":"$name","files":"$files"}},
{"$group":{"_id":"$_id","max":{"$max":"$files"},
"min":{"$min":"$files"}}},
{"$project":{"max_upload":"$max.uploads",
"max_download":"$max.downloads",
"min_upload":"$min.uploads",
"min_downloads":"$min.downloads","_id":0
}
})