mongodb 컬렉션에서 최대한의 가치를 얻는 방법
나는 다음과 같은 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
완전히 사용할 수 있지만 성능은 확신할 수 없습니다.
제시된 답변의 성능은 양호합니다.MongoDB 매뉴얼에 따르면:
$sort가 $limit 직전에 있는 경우optimizer는 $limit을 $120으로 통합할 수 있습니다.이것에 의해, 정렬 조작은 진행중에 상위 n개의 결과만을 유지할 수 있습니다.여기서 n은 지정된 제한치이며, MongoDB는 n개의 항목만 메모리에 저장하면 됩니다.
버전 4.0에서 변경되었습니다.
그래서 의 경우
db.collection.find().sort({age:-1}).limit(1)
언급한 최적화 때문에 컬렉션을 정렬하지 않고 가장 높은 요소만 가져옵니다.
Aggregate Framework를 사용하는 것은 어떨까요?
db.collection.aggregate({ $group : { _id: null, max: { $max : "$age" }}});
여러분, 계획을 실행하면 옵티마이저가 무엇을 하는지 알 수 있습니다.계획을 조사하는 일반적인 형식은 MongoDB 매뉴얼에 기재되어 있습니다.Cursor.plan()
더 깊이 파고들려면, 그 다음 작업을 할 수 있습니다.cursor.plan(true)
자세한 것은, 을 참조해 주세요.
지표를 가지고 있다면, 그 지표를 가지고 있다면,db.col.find().sort({"field":-1}).limit(1)
인덱스가 기본 오름차순이고 컬렉션에서 최대 항목과 값을 원하는 경우에도 인덱스 항목 하나를 읽습니다.
즉, @yogesh의 제안이 맞습니다.
감사합니다 - Summit (서밋)
db.collection.findOne().sort({age:-1}) //get Max without need for limit(1)
간단한 설명: 다음과 같은 mongo 쿼리가 있고 어레이에서 가장 높은 값만 원하는 경우 -> "날짜"
{
"_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"
}
],
},
***그럼 add가 있습니다.
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
집약 파이프라인을 통해서도 이 작업을 수행할 수 있습니다.
db.collection.aggregate([{$sort:{age:-1}}, {$limit:1}])
아래 쿼리는 다른 필드를 사용하지 않고 최대 경과시간을 가져옵니다.
db.collection.find({}, {"_id":0, "age":1}).sort({age:-1}).limit(1)
아래 쿼리는 모든 수집 필드와 함께 최대 에이징을 제공합니다.
db.collection.find({}).sort({age:-1}).limit(1)
언급URL : https://stackoverflow.com/questions/32076382/mongodb-how-to-get-max-value-from-collections
'programing' 카테고리의 다른 글
AJAX를 통해 콘텐츠를 로드한 후 jQuery가 작동하지 않음 (0) | 2023.04.02 |
---|---|
Wordpress 관리 메뉴 항목을 수동으로 강조 표시합니다. (0) | 2023.04.02 |
Wordpress - REST API를 사용하여 사용자 비밀번호를 업데이트하는 방법 (0) | 2023.04.02 |
Ajax 쿼리 포스트 오류를 포착하려면 어떻게 해야 하나요? (0) | 2023.03.14 |
React가 XSS로 보호되고 있다는 것은 무엇을 의미합니까? (0) | 2023.03.14 |