MongoDB从Array中的值中选择MIN / MAX

时间:2015-04-13 10:33:45

标签: javascript mongodb mongoose

所以我在执行查询时遇到问题,只返回一个数组字段内的字段的两个值MIN和MAX ...

client.files.uploads是我想要获得MIN / MAX的字段。

结果只是“0,10”,例如,我不想获取更多字段,只需查看每个client.files.uploads字段并获取整个MIN {MAX上传{{1} } collection有,但只返回最低值和最高值而不是每个客户端的行。

这是我的疑问,但没有得到我想要的东西......

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

2 个答案:

答案 0 :(得分:4)

您的预测是错误的。您使用accumulator operator作为值。将您的预测更改为:

{
    $project:{
        _id: 0,
        data_min: 1,
        data_max: 1
    }
}

答案 1 :(得分:0)

检查此聚合查询

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