我有一个mongodb集合,如:
db.kids.find()
//results
[
{name:'tom', age:10},
{name:'alice', age:12},
....
]
我需要一个查询来从此集合中获取MAX'年龄'
就像在SQL中一样:SELECT MAX(age) FROM kids WHERE 1
答案 0 :(得分:86)
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)