2013-08-01 5 views
1

У меня есть коллекция, которая имеет поле типа массива. Я хочу сортировать на основе поля sub-array, но Mongo не сортирует данные.

Моя коллекция:

{ 
    "_id" : ObjectId("51f1fcc08188d3117c6da351"), 
    "cust_id" : "abc123", 
    "ord_date" : ISODate("2012-10-03T18:30:00Z"), 
    "status" : "A", 
    "price" : 25, 
    "items" : [{ 
     "sku" : "ggg", 
     "qty" : 7, 
     "price" : 2.5 
    }, { 
     "sku" : "ppp", 
     "qty" : 5, 
     "price" : 2.5 
    }] 
} 

Мой запрос является:

db.orders.aggregate([ 
    { "$unwind" : "$items"} , 
    { "$match" : { }} , 
    { "$group" : { "items" : { "$addToSet" : { "sku" : "$items.sku"}} , "_id" : { }}} , 
    { "$sort" : { "items.sku" : 1}} , 
    { "$project" : { "_id" : 0 , "items" : 1}} 
]) 

Результат:

"result" : [ 
      { 
        "items" : [ 
          { 
            "sku" : "ppp" 
          }, 
          { 
            "sku" : "ggg" 
          } 
        ] 
      } 
    ], 
    "ok" : 1 

}

В то время как "sku":"ggg" должен прийти первым, когда это восхождении г.

ответ

2

Вы weant, чтобы сделать вид, прежде чем вы перегруппировать:

db.orders.aggregate([ 
    { "$unwind" : "$items"} , 
    { "$sort" : { "items.sku" : 1}}, 
    { "$match" : { }} , 
    { "$group" : { "items" : { "$push" : { "sku" : "$items.sku"}} , "_id" : null}} , 
    { "$project" : { "_id" : 0 , "items" : 1}} 
]) 
+0

Это не работает, даже чем: rs0: Primary> db.orders.aggregate ([ ... { "$ раскрутку": " $ items "}, ... {" $ sort ": {" items.sku ": 1}}, ... {" $ match ": {}}, ... {" $ group ": {"items": {"$ addToSet": {"sku": "$ items.sku}}," _id ": null}}, ... {" $ project ": {" _id ": 0, "items": 1}} ...]) { "result": [{"items": [{"sku": "ppp"}, {"sku": "ggg"}] } } –

+0

@PhalguniMukherjee Мне нужно будет проверить это, он должен $ нажать, чтобы установить как таковое, его нужно заказать, теоретически – Sammaye

+0

Да, '$ push' работал. –