2012-09-16 16 views
27

Öğrencilerin bir veritabanı ve iletişim bilgilerini aldım. En çok öğrenciyi barındıran posta kodunu bulmaya çalışıyorum. {: 'Smi0001', ad: 'bob', soyadı: 'smith', posta kodu: 2001 studentcode}mongodb aggregation sort

I öğrencileri için belgeler ...

şuna benzer Ben ... şey gibi yaparak en öğrencilerle posta kodu bulmak için (beklenen _id olarak posta kodları ve öğrenci numarasını verir gibi çalıştığını

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}}) 

toplama çerçevesini kullanabilirsiniz düşünce her posta kodu 'öğrenci' olarak, ancak $sort'u boru hattına eklerseniz, $group işleminin sonuçları yerine tüm öğrenci koleksiyonuna göre sıralama yapmayı deneyebilirsiniz. Ben böyle bir görünüm çalıştığım şey

...

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}, $sort: {_id: -1}}) 

ama bütün toplama döner ve $project ve $group ... ben eksik bir şey göz ardı? Az sayıda öğrenci sayısına göre sıralayabileceğimi ve ilk maddeyi iade edebileceğimi düşündüm. Yardımlarınız için şimdiden teşekkür ederiz. Neredeyse vardı

cevap

47

...

db.test.aggregate(
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {_id: -1}} 
); 

(Ben senin numune uyduran bazı test verileri eklendi) verir:

{ 
    "result" : [ 
    { 
     "_id" : 2003, 
     "students" : 3 
    }, 
    { 
     "_id" : 2002, 
     "students" : 1 
    }, 
    { 
     "_id" : 2001, 
     "students" : 2 
    } 
    ], 
    "ok" : 1 
} 

Bazı karışıklığa neden olan herşeyin etrafında bir dış {} vardı . Grup ve sıralama, boru hattında ayrı işlemler olarak çalışmadı.

Bu dava için projeye gerçekten ihtiyacınız yok. Muhtemelen ilk (nüfusun) büyük zipcodes almak için, bu yüzden gibi "öğrenciler" göre sıralamak istiyorum

Güncelleme:

db.test.aggregate(
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {students: -1}} 
); 
+0

Tavsiye için yığınlar için teşekkürler. Sadece yanlış yerleştirilmiş bir parantez sorunu olduğuna inanamıyorum. Bunlar, 15 yıl önce SQL öğrenmeyi alışkanlık haline getiren bir çeşit problemlerdi, mongodb'e geçme, çok fazla ön bilginin geride kalması anlamına geliyordu, ama buna değeceğimi düşünüyorum. Şerefe, –

+0

Kullanım durumunuz için çalışır, ancak bu yaklaşım her zaman görmeyi beklediğiniz sonuçları garanti etmez. Örneğin, "field1" ile gruplandırmanız gerektiğinde sonuçlar yanlış olacaktır, ancak "field2" ile sıralamaya devam edin. – astronaut

+0

POST1, POST2, POST3 posta kodlarım vardı, her posta kodu öğrencilerin sayısından farklı. Her bir POST’un toplamını almak için sıralama sorgum ne olmalıdır? db.test.aggregate ( {$ grubu: {_ID: { 'posta kodları': '$ posta kodları'}, öğrenciler: {$ toplamı: 1}}}, ne tür sorgu burada olmalı .); –

3

Ben Sözdiziminizin biraz yanlış olduğunu düşünüyorum. Boru hattındaki her bir toplama işlemi kendi belgesi olmalıdır. Senin durumunda

db.students.aggregate({$project: ...}, {$group: ...}, {$sort: ...}) 

, bu olmalıdır: Ben senin şemasına dayalı örnek bir koleksiyon üzerinde test ettik ve onu öğrenci sayısına göre gruplandırılmış sonrası kodlarını sıralama, benim için çalışıyor

db.students.aggregate(
    {$project: { postcode: 1 }}, 
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {students: -1}} 
) 

, Azalan.

+0

Bu projede '$ project' sizin için bir şey yapar mı? –

+0

@WesFreeman Haklısınız, $ proje ihmal edilebilir. Sanırım gerçekten çok büyük belgeleriniz varsa, bunları boru hattında daha fazla işlem yapmak için yalnızca gerekli bilgilere indirgemek avantajlı olabilir, ancak bu durumda çok fazla şey elde edilemez. – Thomas

+0

Evet, 'öğrenci' belgelerim aslında bir yığın daha fazla alana sahip, bu yüzden gereksiz alanları kesmek için proje kullanıyorum. –