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