Javascript MongoDB从数组内的值中选择最小/最大值

Javascript MongoDB从数组内的值中选择最小/最大值,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,所以我在执行一个查询时遇到了问题,该查询只返回两个值,一个数组字段中的字段的最小值和最大值 client.files.uploads是我想要获取最小/最大值的字段 结果将是“0,10”,例如,我不想获得更多字段,只需查看每个client.files.uploads字段,并获得整个client集合的最小/最大上载量,但只返回最低和最高值,而不是每个客户端的一行 这是我的问题,但没有得到我想要的 db.client.aggregate([ {$unwind: "$files"}, {

所以我在执行一个查询时遇到了问题,该查询只返回两个值,一个数组字段中的字段的最小值和最大值

client.files.uploads
是我想要获取最小/最大值的字段

结果将是“
0,10
”,例如,我不想获得更多字段,只需查看每个
client.files.uploads
字段,并获得整个
client
集合的最小/最大上载量,但只返回最低和最高值,而不是每个客户端的一行

这是我的问题,但没有得到我想要的

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
})
这个查询只返回一行,其中包含整个集合的最低值和最高值,这正是我想要的

这是我的文档的一个示例数据

[
  {
    "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
      }
    ]
  }
]

你的预测是错误的。您正在使用as值。将您的投影更改为:

{
    $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
                                  }
                     })

你的答案是正确的,但我改变了我的问题,因为它似乎是错误的,我不仅想得到两个字段(这是你的答案,是100%正确的),我的意思是我只想返回一行,整个集合的最低和最高值,这是我用两个组完成的,但是也许有更好的选择(请参阅我的更新)您的聚合很好,但是在第二个
$group
中,使用
\u id:null
而不是
\u id:“1”
好的,谢谢,我已经更改了它。我想可能是因为这两组人的原因,我的查询不好(即使有效),也许还有其他方法可以实现。。谢谢抱歉我不在,完全忘了stackoverflow!这是行不通的。刚刚测试过。OP查询还有什么问题?