Nice programing

mongodb 컬렉션에서 최대 가치를 얻는 방법

nicepro 2020. 11. 16. 22:10
반응형

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 바로 앞에 오면 옵티마이 저는 $ limit를 $ sort로 통합 할 수 있습니다. 이렇게하면 정렬 작업이 진행될 때 상위 n 개의 결과 만 유지할 수 있습니다 . 여기서 n은 지정된 제한 이고 MongoDB는 메모리에 n 개의 항목 만 저장하면됩니다.

버전 4.0에서 변경되었습니다.

그래서의 경우

db.collection.find().sort({age:-1}).limit(1)

우리는 가장 높은 요소를 얻을 없이 때문에 언급 한 최적화의 컬렉션을 정렬.


집계 프레임 워크 사용은 어떻습니까?

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

여러분은 계획을 실행하여 최적화 프로그램이 무엇을하는지 알 수 있습니다. 계획을 살펴 보는 일반적인 형식은 MongoDB 문서 에서 가져온 것 입니다. 즉 Cursor.plan (). 정말로 더 깊이 파고 싶다면 cursor.plan (true)을 통해 자세한 내용을 확인할 수 있습니다.

인덱스가있는 경우 db.col.find (). sort ({ "field":-1}). limit (1)은 인덱스가 기본 오름차순이고 원하는 경우에도 하나의 인덱스 항목을 읽습니다. 컬렉션의 최대 항목과 하나의 값.

즉, @yogesh의 제안이 정확합니다.

감사합니다-Sumit


그룹 및 최대를 사용할 수 있습니다.

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


간단한 설명, 아래와 같은 몽고 쿼리 응답 이 있고 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

참고 URL : https://stackoverflow.com/questions/32076382/mongodb-how-to-get-max-value-from-collections

반응형