Mongodb 获取数组中第一个元素的最大值?

Mongodb 获取数组中第一个元素的最大值?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,假设我有如下文件: { email: "test@test.com", values: [2,9] }, { email: "test@test.com", values: [1,3] }, { email: "another@email.com", values: [4,5] }, 我想为每封电子邮件获取values数组中第一个元素的最大值(因此2fortest@test.com。是否可以仅将$max应用于数组的第一个元素?我尝试了以下方法: db.tes

假设我有如下文件:

{
   email: "test@test.com",
   values: [2,9]
},
{
   email: "test@test.com",
   values: [1,3]
},
{
   email: "another@email.com",
   values: [4,5]
},
我想为每封电子邮件获取
values
数组中第一个元素的最大值(因此
2
for
test@test.com
。是否可以仅将
$max
应用于数组的第一个元素?我尝试了以下方法:

db.test.aggregate({$group:{_id: '$email', max: {$max: "$values[0]"}}})


但是这两种方法似乎都不起作用(它们返回
null
max
的空数组)。可以这样做吗?

关闭try,但不幸的是,像
.find()这样的方法可用的标准投影形式
不适用于聚合框架。您需要更多的参与才能得到您想要的

db.test.aggregate([
//展开阵列
{“$unwind”:“$values”},
//从每个文档中获取第一个值。是的,遵守顺序。
{“$组”:{
“\u id”:“$\u id”,
“电子邮件”:{“$first”:“$email”},
“firstValue”:{“$first”:“$values”}
}},
//然后获取每个分组键的“max”
{“$组”:{
“_id”:“$email”,
“value”:{“$max”:“$firstValue”}
}}
])
这是因为在“分组边界”上提取“第一个”匹配,并且在展开数组内容时尊重数组的顺序

因此,“第一”阶段获取文档中的“第一”数组元素,“第二”阶段在提取完所有这些值后对其执行检查

注意:不要问如何获得“n”值,因为这完全是另一个问题,而且涉及面更广。如果你坚持到底,这是一个合乎逻辑的过程。这不是一个最佳解决方案,但可以做到


相信我,我们已经为“切片”投影和操作“限制”绞尽脑汁了一段时间。这可能有一天会发生。

我建议一种更简短、更通用的解决方案,适用于数组的任何索引:

db.test.aggregate([
  {$project: {email: "$email", first_value:
      {$arrayElemAt: [ "$values", 0]}}},
  {$group: {_id: '$email', value: {$max: '$first_value'}}}
])

一如既往的精彩,请开始你关于mongo的博客
db.test.aggregate([
  {$project: {email: "$email", first_value:
      {$arrayElemAt: [ "$values", 0]}}},
  {$group: {_id: '$email', value: {$max: '$first_value'}}}
])