programing

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

nicescript 2023. 4. 2. 12:51
반응형

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

반응형