다음과 같은 mongodb 컬렉션이 있습니다.
db.kids.find()
//results
[
{name:'tom', age:10},
{name:'alice', age:12},
....
]
SQL에서와 같이이 컬렉션에서 MAX 'age'를 얻으려면 쿼리가 필요합니다. SELECT MAX(age) FROM kids WHERE 1
답변:
의견 중 하나로 :
db.collection.find().sort({age:-1}).limit(1) // for MAX
db.collection.find().sort({age:+1}).limit(1) // for MIN
완전히 사용할 수 있지만 성능이 확실하지 않습니다.
age
필드에 인덱스를 정의하는 것이 좋습니다 . 당신이 사용하는 경우 db.collection.find({}, {age: 1, _id:0}).sort({age:-1}).limit(1)
, 당신은 아마 매우 빠른 것 대상 쿼리
제안 된 답변의 성능이 좋습니다. MongoDB 문서 에 따르면 :
$ sort가 $ limit 바로 앞에 오면 옵티마이 저는 $ limit를 $ sort로 통합 할 수 있습니다. 이렇게하면 정렬 작업이 진행되는 동안 상위 n 개의 결과 만 유지할 수 있습니다 . 여기서 n은 지정된 제한입니다. 이고 MongoDB는 메모리에 n 개의 항목 만 저장하면됩니다.
버전 4.0에서 변경되었습니다.
그래서의 경우
db.collection.find().sort({age:-1}).limit(1)
우리는 가장 높은 요소를 얻을 없이 때문에 언급 한 최적화의 컬렉션을 정렬.
find( ... ).sort( ... ).limit( ... )
과 같은 방식으로 처리됩니다 aggregate([{$match: ... }, {$sort: ...}, {$limit: ...}])
? 몽고 문서에 그들이 이것을 언급하는 곳이 있습니까?
집계 프레임 워크 사용은 어떻습니까?
db.collection.aggregate({ $group : { _id: null, max: { $max : "$age" }}});
그룹 및 최대를 사용할 수 있습니다.
db.getCollection('kids').aggregate([
{
$group: {
_id: null,
maxQuantity: {$max: "$age"}
}
}
])
db.collection.findOne().sort({age:-1}) //get Max without need for limit(1)
TypeError: db.collection.findOne(...).sort is not a function
. collection.findOne ()은 문서 자체를 반환하므로 sort ()를 호출하면 작동하지 않을 것 같습니다.
여러분은 계획을 실행하여 최적화 프로그램이 수행하는 작업을 볼 수 있습니다. 계획을 살펴 보는 일반적인 형식은 MongoDB 문서 에서 가져온 것 입니다. 즉 Cursor.plan()
. 정말로 더 깊이 파고 싶다면 cursor.plan(true)
더 자세한 내용을 위해 할 수 있습니다 .
당신은 인덱스가있는 경우, 당신했다 가졌 db.col.find().sort({"field":-1}).limit(1)
인덱스는 기본적으로 상승하는 경우에도 당신이 컬렉션에서 최대 입력과 하나 개의 값을 원 - 하나 개의 인덱스 항목을 읽습니다.
즉, @yogesh의 제안이 정확합니다.
감사합니다-Sumit
간단한 설명, 아래와 같은 몽고 쿼리 응답 이 있고 Array-> "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"
],
"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"
},
최대 값의 경우 SQL 쿼리를 다음과 같이 작성할 수 있습니다.
select age from table_name order by age desc limit 1
mongodb에서도 같은 방식으로 작성할 수 있습니다.
db.getCollection('collection_name').find().sort({"age" : -1}).limit(1); //max age
db.getCollection('collection_name').find().sort({"age" : 1}).limit(1); //min age