【发布时间】:2020-04-28 23:25:25
【问题描述】:
我有一个test 收藏:
{
"_id" : ObjectId("5exxxxxx03"),
"username" : "abc",
"col1" : [
{
"colId" : 1
"col2" : [
{
"name" : "a",
"value" : 10
},
{
"name" : "b",
"value" : 20
},
{
"name" : "c",
"value" : 30
}
],
"col3" : [
{
"name" : "d",
"value" : 15
},
{
"name" : "e",
"value" : 25
},
{
"name" : "f",
"value" : 35
}
]
}
]
}
col1 具有子文档col2 和col3 的列表,它们相似,但传达的含义不同。这两个子文档具有name 和value 作为字段。
现在,我需要从col2 或col3 及其对应的name 中找到最大的value。
我尝试了以下查询:
db.test.aggregate([
{$unwind: '$col1'},
{$unwind: '$col1.col2'},
{$unwind: '$col1.col3'},
{$group:
{_id: '$col1.colId',
maxCol2: {$max: '$col1.col2.value'},
maxCol3: {$max: '$col1.col3.value'}}},
{$project:
{maxValue: {$max: ['$maxCol2', '$maxCol3']},
name: {$cond: [
{$eq: ['$maxValue', '$maxCol2']},
'$col1.col2.name',
'$col1.col3.name']}}}]).pretty()
但是,结果如下,其中没有 name 字段:
{ "_id" : 1, "maxValue" : 35 }
所以,为了检查一下我的情况是否正确,请尝试以下查询($col1.col2.name 和 $col1.col3.name 替换为 111 和 222 字符串):
db.test.aggregate([
{$unwind: '$col1'},
{$unwind: '$col1.col2'},
{$unwind: '$col1.col3'},
{$group:
{_id: '$col1.colId',
maxCol2: {$max: '$col1.col2.value'},
maxCol3: {$max: '$col1.col3.value'}}},
{$project:
{maxValue: {$max: ['$maxCol2', '$maxCol3']},
name: {$cond: [
{$eq: ['$maxValue', '$maxCol2']},
'111',
'222']}}}]).pretty()
这给了我预期的输出:
{ "_id" : 1, "maxValue" : 35, "name" : "222" }
谁能指导我为什么我没有得到正确的答案,我应该如何查询这个以获得正确的输出?
正确的输出应该是:
{ "_id" : 1, "maxValue" : 35, "name" : "f" }
附: - 我是初学者。
【问题讨论】:
-
您可以尝试使用 $addFields 之类的方法来执行条件映射并从 $project 中删除条件。此外,如果您使用的不是最新的服务器版本,请尝试升级。
-
@ngShavil.py :如果
col1数组中有多个对象怎么办?使用"colId" : 1、"colId" : 2和"colId" : 3... 你想为col1中的每个单独对象获得最大还是为所有"colId" : 1、"colId" : 2和"colId" : 3组合获得最大? -
@whoami,我想为
col1中的每个单独对象获得最大的。 -
@Oleg,谢谢,我会试试的。
标签: mongodb mongodb-query aggregation-framework