2011-03-15 36 views
18

Belgeleri, en düşük foo.bar değerini (dizi nesnesi olan) içeren sırayla döndürmek istiyorum.Mongodb: dizi nesnelere göre belgeleri sırala

db.collection.find().sort({foo.0.bar: 1}) yapabilirim, ancak bu yalnızca dizideki ilk öğe ile eşleşir - ve aşağıdaki incelemede gördüğünüz gibi, ilk olarak öğe 1'i sıralar (foo.0.bar = 5), wheras Geri dönmek istiyorum öğe 2 en düşük değere sahip nesneyi olduğu gibi ilk (foo.2.bar = 4).

{ 
    "name": "Item 1", 
    "foo": [ 
     { 
      "bar": 5 
     }, 
     { 
      "bar": 6 
     }, 
     { 
      "bar": 7 
     } 
    ] 
} 
{ 
    "name": "item 2", 
    "foo": [ 
     { 
      "bar": 6 
     }, 
     { 
      "bar": 5 
     }, 
     { 
      "bar": 4 
     } 
    ] 
} 
+0

db.collection.find() ({foo.bar: 1}). – Troglo

cevap

0

Bunu mongo'da yapmak için doğrudan bir yol yoktur. Her bir dizideki min değerini almak ve daha sonra da bu min değerine göre sıralamak için haritayı kullanmanız gerekir.

+0

teşekkürler. Fakat harita/küçültme işlevi örnekte neye benziyordu? –

4

Harita/küçültme kullanmanın alternatifi, min değerini diziden ayrı bir alan olarak saklamaktır. Daha sonra sipariş verebileceğiniz belge. Diziye eklediğinizde, yeni değer şu anda kaydedilen minimum değerden daha düşükse, bu alanı da güncellersiniz.

örn. İlk belge ("minber eklendi" notu) bu olacaktı:

{ 
    "name": "Item 1", 
    "minbar" : 5, 
    "foo": [ 
     { 
      "bar": 5, 
     } 
     { 
      "bar": 6, 
     } 
     { 
      "bar": 7, 
     } 
    ] 
} 
+0

Bu harika bir fikir - ve bu özel örnekte iyi çalışır. Ancak, bunun birden fazla dizi için yapılması gereken daha karmaşık bir şemada (yani benim gerçek dünya şemasında) biraz dağınık hale gelecektir. –

19

Mongo yapabilirsiniz görünüyor. Örneğin

, ben aşağıdaki belgeleri varsa: Aşağıdaki

{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 

Ve çalıştırın: Gördüğünüz gibi

db.collection.find({}).sort({ "a.b.c":1 }); 
// produces: 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 

db.collection.find({}).sort({ "a.b.c":-1 }); 
// produces: 
{ a:{ b:[ {c:0}, {c:12} ] } } 
{ a:{ b:[ {c:1}, {c:9 } ] } } 
{ a:{ b:[ {c:1}, {c:5 } ] } } 
{ a:{ b:[ {c:4}, {c:3 } ] } } 

, {"a.b.c":1} göre sıralama tüm değerlerin dk alır dizide ve sırayla, {"a.b.c":-1} tarafından sıralama, tüm değerlerin max alır.

+1

Her iki çıkışınız da aynı sonucu veriyor. Bu doğru mu? – Raman

+4

yakından bakmak zorundasınız. İlk sonuç, 0, 1, 1, 3'e zorlanıyor. saniye 12.9,5,4 azalacak. – rompetroll

4

Sen Mongo sürüm 2.2 den agrega komutla böyle bir sıralama yapabiliriz: sort

db.collection.aggregate([{$unwind: "$foo"}, 
    {$project: {bars:"$foo.bar"}}, 
    {$group: {_id:"$_id",min:{$min: "$bars"}}}, 
    {$sort: {min:1}}]) 
+0

Örneğiniz için teşekkür ederiz! – Vor