2013-02-04 28 views
5

Tôi thấy nhiều câu trả lời cho câu hỏi "làm cách nào để có được tất cả các giá trị duy nhất trong một trường?" đề xuất phương pháp .distinct(). Nhưng điều này trả về một mảng đơn giản của những giá trị đó. Làm cách nào để truy xuất tất cả các tài liệu CÓ giá trị duy nhất của một trường?MongoDB truy vấn cho tất cả tài liệu có trường duy nhất

[{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
Query for unique age --> 
[{age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
or 
[{age: 21, name: 'bob'}, {age: 30, name: 'Jim'}] 

Lọc truy vấn sau khi thực tế không phải là giải pháp lý tưởng vì tôi vẫn muốn chọn, giới hạn $ và $ bỏ qua như bình thường.

+0

tiêu chí lựa chọn giữa 'sally' và' bob' là gì, nếu cả hai đều có cùng độ tuổi? –

+0

Trên thực tế, tiêu chí lựa chọn hai tài liệu là 'sally' nói chung là gì? Bạn muốn quay trở lại tài liệu nào? – Sammaye

+0

@RyanArtecona Bạn đã dự đoán câu hỏi tiếp theo của tôi (cách chỉ định bộ lọc). Đối với trường hợp sử dụng cụ thể của tôi, tôi cần bản ghi "mới nhất", nhưng tôi không nghĩ rằng nó sẽ là cần thiết để bùn nước ở đây cho đến khi nhìn thấy một người nào đó sẽ lọc gì cả. – Sinetheta

Trả lời

3
> db.foo.insert([{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}]) 
> db.foo.count() 
3 
> db.foo.aggregate({ $group: { _id: '$age', name: { $max: '$name' } } }).result 
[ 
    { 
     "_id" : 30, 
     "name" : "Jim" 
    }, 
    { 
     "_id" : 21, 
     "name" : "sally" 
    } 
] 
+1

Vì vậy, tất cả tài liệu cần phải được "xây dựng lại"? Điều gì sẽ xảy ra nếu có các thuộc tính khác (ví dụ: chiều cao, cân nặng), làm cách nào để có được toàn bộ bản ghi với '$ max: '$ name'' và không chỉ ghim tên tối đa vào nhóm $ age? – Sinetheta

+0

Nó giống như một "GROUP BY" của SQL, sau đó nếu các tài liệu có một trường được gọi là 'other_field', thì bạn nên thêm vào' $ group' một biểu thức nói cách bạn muốn nhóm trường đó. Xem biểu thức 'name: {$ max: '$ name'}' trong ví dụ của tôi. –

+1

Điều đó sẽ cung cấp cho bạn thông tin một người không nhất thiết tồn tại, '{" _id: 30 ", tên:" tên tối đa từ những người có id 30 ", other_field:" max other_field từ những người có id 30 "}'. (trước khi bạn chỉnh sửa). Vì vậy, lệnh để lấy other_field từ bản ghi với $ max: '$ name' là gì? – Sinetheta

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