2013-02-04 17 views
5

Bir alandaki tüm benzersiz değerleri nasıl alabilirim? Bu, .distinct() yöntemini önerir. Ancak bu, bu değerlerin basit bir dizisini döndürür. Bir alanın benzersiz bir değeri olan tüm belgeleri nasıl alabilirim?Tekil alana sahip tüm belgeler için MongoDB sorgusu

[{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'}] 

Hala, $ sınırını seçmek istediğiniz gibi-gerçeği sonrası, ideal bir çözüm değildir ve $ her zamanki gibi atlamak bir sorgu filtreleme.

+0

Eğer ikisi de aynı yaş varsa, 'sally' ve 'bob' arasında seçim yapmak için ölçütünüz nedir? –

+0

Aslında, genel olarak 'sally' olan iki belgeyi seçmek için kriterler nelerdir? Hangi belgeyi iade etmek istersiniz? – Sammaye

+0

@RyanArtecona Takip soruumu tahmin ettiniz (filtrenin nasıl belirtileceği). Benim özel kullanım vakam için "en son" rekorlara ihtiyacım var, ama birisinin nasıl süzüleceğini görene kadar buradaki suların çamurlanması gerekmeyeceğini düşünmüyordum. – Sinetheta

cevap

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

Yani tüm belgenin "yeniden yapılandırılması" gerekiyor mu? Ya diğer özellikler olsaydı (örneğin: boy, kilo), tüm rekoru “$ max: '$ name” ile nasıl elde edersek, maksimum değeri sadece gruplandırılmış $ yaşına dayamaz mıyız? – Sinetheta

+0

Tıpkı bir SQL "GROUP BY" gibi, eğer belgelerin 'other_field' adlı bir alanı varsa, o zaman bu grubu nasıl gruplandırmak istediğinizi söyleyerek' $ group' ifadenize eklemelisiniz. Örneğimde 'name: {$ max: '$ name'}' ifadesine bakın. –

+1

Bu size, mutlaka mevcut olmayan bir bilgiyi verecektir, '{"_id: 30", ad: "id 30 olanlardan maksimum isim", other_field: "id 30 olanlardan maksimum other_field"}. (düzenlemeden önce). Öyleyse diğer_alanı $ max: '$ name' ile kayıttan alma komutu nedir? – Sinetheta

İlgili konular