2015-08-18 27 views
31

Tôi có một bộ sưu tập MongoDB như:MongoDB làm thế nào để nhận được giá trị tối đa từ bộ sưu tập

db.kids.find() 
//results 
[ 
    {name:'tom', age:10}, 
    {name:'alice', age:12}, 
    .... 
] 

Tôi cần một truy vấn để có được MAX 'tuổi' từ bộ sưu tập này như trong SQL: SELECT MAX(age) FROM kids WHERE 1

+3

thể trùng lặp của [MongoDB: tìm giá trị số cao nhất của một cột] (http://stackoverflow.com/questions/15072658/mongodb-finding-the-highest-numeric-value- of-a-column) – Yogesh

+1

bạn có thể sử dụng 'db.collection.find(). sắp xếp ({tuổi: -1}). giới hạn (1)' – Vishwas

+0

cảm ơn. nó hoạt động –

Trả lời

39

As one of comments:

db.collection.find().sort({age:-1}).limit(1) // for MAX 
db.collection.find().sort({age:+1}).limit(1) // for MIN 

nó hoàn toàn có thể sử dụng nhưng tôi không chắc chắn về hiệu suất

+3

Trong trường hợp của một bộ sưu tập lớn, tốt hơn là xác định một chỉ mục trên trường 'age'. Sau đó, nếu bạn sử dụng 'db.collection.find ({}, {age: 1, _id: 0}). Sắp xếp ({age: -1}) .giới hạn (1)', bạn có thể sẽ có rất nhanh [Covered Truy vấn] (https://docs.mongodb.com/v3.0/core/query-optimization/#covered-query) –

6

điều gì về việc sử dụng khung tổng hợp:

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

Điều này không hiệu quả như sort.limit. Tuy nhiên, tôi biết sâu bên dưới tất cả mọi người cảm thấy kỳ lạ về loại đó và giới hạn ... –

+0

@ AFP_555 Thật ngạc nhiên khi biết rằng tổng hợp là chậm hơn so với truy vấn sắp xếp giới hạn. Cám ơn vì đã chia sẻ! –

+0

có tổng hợp chậm hơn truy vấn giới hạn sắp xếp không? – ashusvirus

17

Hiệu suất của câu trả lời được đề xuất là tốt. Theo MongoDB documentation:

Khi một $ loại ngay trước một $ hạn, tôi ưu hoa có thể kết thành một khối giới hạn $ vào $ loại. Điều này cho phép hoạt động loại chỉ duy trì đỉnh n quả vì nó tiến triển, nơi n là giới hạn quy định và MongoDB chỉ cần lưu trữ n mục trong bộ nhớ .

Vì vậy, trong trường hợp của

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

chúng tôi chỉ nhận được những yếu tố cao nhất KHÔNG sắp xếp bộ sưu tập vì việc tối ưu hóa đề cập.

1

Giải thích đơn giản, nếu bạn có đáp ứng truy vấn Mongo cái gì đó như dưới đây - và bạn muốn chỉ có giá trị cao nhất từ ​​Array-> "Ngày"

{ 
    "_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": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 

}, 

*** Sau đó, bạn đã thêm

Latest_Wish_CreatedDate: {$ max: "ngày $"},

somthing như liệt kê dưới đây

{ 
       $project : { _id: 1, 
          TotalWishs : 1 , 
           wish:1 , 
           Events:1, 
           Wish_CreatedDate:1, 
           Latest_Wish_CreatedDate: { $max: "$Date"}, 
          } 
      } 

Và cuối cùng Query đáp ứng sẽ được dưới

{ 
    "_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": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 
    "Latest_Wish_CreatedDate": "2017-03-05T00:00:00.000Z" 
}, 
0

Folks bạn có thể xem những gì tôi ưu hoa được làm bằng cách chạy một kế hoạch. Định dạng chung của việc xem xét kế hoạch là từ MongoDB documentation. tức là Cursor.plan(). Nếu bạn thực sự muốn đào sâu hơn, bạn có thể thực hiện một cursor.plan (true) để biết thêm chi tiết.

Có nói rằng nếu bạn có chỉ mục, db.col.find(). Sort ({"field": - 1}). Limit (1) sẽ đọc một mục chỉ mục - ngay cả khi chỉ mục là mặc định tăng dần và bạn muốn mục nhập tối đa và một giá trị từ bộ sưu tập.

Nói cách khác, các đề xuất từ ​​@yogesh là chính xác.

Cảm ơn - Sumit

Các vấn đề liên quan