mongodb如何从集合中获取最大价值

时间:2015-08-18 15:18:51

标签: mongodb max

我有一个mongodb集合,如:

db.kids.find()
//results
[
    {name:'tom', age:10},
    {name:'alice', age:12},
    ....
]

我需要一个查询来从此集合中获取MAX'年龄' 就像在SQL中一样:SELECT MAX(age) FROM kids WHERE 1

9 个答案:

答案 0 :(得分:86)

As one of comments

db.collection.find().sort({age:-1}).limit(1) // for MAX
db.collection.find().sort({age:+1}).limit(1) // for MIN

它完全可用,但我对性能不确定

答案 1 :(得分:45)

建议答案的表现很好。根据{{​​3}}:

  

当$ sort紧接在$ limit 之前时,优化程序可以将$ limit合并到$ sort中。这允许排序操作   在进展时仅保持前n个结果,其中 n为   指定的限制,MongoDB只需要存储n个项目   存储器中。

     

在版本4.0中更改。

所以在

的情况下
db.collection.find().sort({age:-1}).limit(1)

由于上述优化,我们只获得了最高元素 WITHOUT 对集合进行排序。

答案 2 :(得分:12)

使用聚合框架怎么样:

db.collection.aggregate({ $group : { _id: null, max: { $max : "$age" }}});

答案 3 :(得分:2)

通过运行计划,您可以看到优化程序正在执行的操作。查看计划的通用格式来自MongoDB documentation。即Cursor.plan()。如果您真的想深入挖掘,可以使用cursor.plan(true)获取更多详细信息。

如果你有一个索引,你的db.col.find()。sort({" field": - 1})。limit(1)将读取一个索引条目 - 即使索引是默认升序,您希望最大条目和集合中的一个值。

换句话说,来自@yogesh的建议是正确的。

谢谢 - Sumit

答案 4 :(得分:2)

您可以使用group和max:

db.getCollection('kids').aggregate([
    {
        $group: {
            _id: null,
            maxQuantity: {$max: "$age"}
        }
    }
])

答案 5 :(得分:1)

简单说明, 如果您有mongo查询响应,如下所示 - 并且您只需要来自 Array->的最高值"日期"

{
  "_id": "57ee5a708e117c754915a2a2",
  "TotalWishs": 3,
  "Events": [
    "57f805c866bf62f12edb8024"
  ],
  "wish": [
    "Cosmic Eldorado  Mountain Bikes, 26-inch (Grey/White)",
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)",
    "Suunto Digital Black Dial Unisex Watch - SS018734000"
  ],
  "Date": [
    "2017-02-13T00:00:00.000Z",
    "2017-03-05T00:00:00.000Z"
  ],
  "UserDetails": [
    {
      "createdAt": "2016-09-30T12:28:32.773Z",
      "jeenesFriends": [
        "57edf8a96ad8f6ff453a384a",
        "57ee516c8e117c754915a26b",
        "58a1644b6c91d2af783770b0",
        "57ef4631b97d81824cf54795"
      ],
      "userImage": "user_profile/Male.png",
      "email": "roopak@small-screen.com",
      "fullName": "Roopak Kapoor"
    }
  ],

},

***然后你添加了

  

Latest_Wish_CreatedDate:{$ max:" $ Date"},

如下所示 -

{ 
                $project : { _id: 1,
                             TotalWishs : 1 ,
                              wish:1 ,
                               Events:1, 
                               Wish_CreatedDate:1,
                               Latest_Wish_CreatedDate: { $max: "$Date"},
                            } 
            } 

最终查询响应将低于

{
  "_id": "57ee5a708e117c754915a2a2",
  "TotalWishs": 3,
  "Events": [
    "57f805c866bf62f12edb8024"
  ],
  "wish": [
    "Cosmic Eldorado  Mountain Bikes, 26-inch (Grey/White)",
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)",
    "Suunto Digital Black Dial Unisex Watch - SS018734000"
  ],
  "Wish_CreatedDate": [
    "2017-03-05T00:00:00.000Z",
    "2017-02-13T00:00:00.000Z"
  ],
  "UserDetails": [
    {
      "createdAt": "2016-09-30T12:28:32.773Z",
      "jeenesFriends": [
        "57edf8a96ad8f6ff453a384a",
        "57ee516c8e117c754915a26b",
        "58a1644b6c91d2af783770b0",
        "57ef4631b97d81824cf54795"
      ],
      "userImage": "user_profile/Male.png",
      "email": "roopak@small-screen.com",
      "fullName": "Roopak Kapoor"
    }
  ],
  "Latest_Wish_CreatedDate": "2017-03-05T00:00:00.000Z"
},

答案 6 :(得分:1)

对于最大值,我们可以将sql查询写为

db.getCollection('collection_name').find().sort({"age" : -1}).limit(1); //max age
db.getCollection('collection_name').find().sort({"age" : 1}).limit(1); //min age

我们也可以用mongodb编写相同的方法。

     $my_array = [
        1 => 'One',
        2 => 'Two',
        3 => 'Three',
        4 => 'Four',
        5 => 'Five'
    ];

    array_walk($my_array, function ($value, $key) use (&$new_array) {
        $new_array[':' . $key] = $value;
    });

答案 7 :(得分:1)

您也可以通过聚合管道来实现这一目标。

db.collection.aggregate([{$sort:{age:-1}}, {$limit:1}])

答案 8 :(得分:0)

db.collection.findOne().sort({age:-1}) //get Max without need for limit(1)