gpt4 book ai didi

mongodb - 使用 mongodb 中的聚合获取所有具有最大值的文档

转载 作者:IT老高 更新时间:2023-10-28 13:32:04 25 4
gpt4 key购买 nike

我想获取特定字段的最高值的“所有文档”,而不是按另一个字段分组。

考虑以下数据:

_id:1, country:india,  quantity:12,  name:xyz
_id:2, country:USA, quantity:5, name:abc
_id:3, country:USA, quantity:6, name:xyz
_id:4, country:india, quantity:8, name:def
_id:5, country:USA, quantity:10, name:jkl
_id:6, country:india, quantity:12, name:jkl

答案应该是

country:india max-quantity:12
name xyz
name jkl

country:USA max-quantity:10
name jkl

我已经尝试了几个查询,但我只能获得没有名称的最大值,或者我可以分组但它显示了所有值。

db.coll.aggregate([{
$group:{
_id:"$country",
"maxQuantity":{$max:"$quantity"}
}
}])

例如上面将给出每个国家的最大数量,但如何与其他字段结合以显示所有最大数量的文档。

最佳答案

如果你想保留文档信息,那么你基本上需要$push它成一个数组。但是,当然,然后拥有您的 $max值,您需要过滤数组的内容以仅匹配匹配的元素:

db.coll.aggregate([
{ "$group":{
"_id": "$country",
"maxQuantity": { "$max": "$quantity" },
"docs": { "$push": {
"_id": "$_id",
"name": "$name",
"quantity": "$quantity"
}}
}},
{ "$project": {
"maxQuantity": 1,
"docs": {
"$setDifference": [
{ "$map": {
"input": "$docs",
"as": "doc",
"in": {
"$cond": [
{ "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
"$$doc",
false
]
}
}},
[false]
]
}
}}
])

因此,您将所有内容存储在一个数组中,然后测试每个数组成员以查看它的值是否与记录为最大值的值匹配,丢弃任何不匹配的值。

我会将 _id 值保留在数组文档中,因为这使它们“独一无二”并且不会受到 $setDifference 的不利影响过滤掉值时。但当然,如果“名称”始终是唯一的,那么它就不是必需的。

您也可以从 $map 返回任何您想要的字段。 ,但我只是返回整个文档。

请记住,这有不超过 16MB 的 BSON 大小限制的限制,因此对于小数据样本是可以的,但是任何产生潜在大列表的东西(因为你不能预先过滤数组内容)会更好使用单独的查询处理以查找“最大值”值,并使用另一个查询来获取匹配的文档。

关于mongodb - 使用 mongodb 中的聚合获取所有具有最大值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33361697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com