2014-02-11 2 views
0

Мои Mongo коллекции содержит документы, такие как следующие:Монго вложенная ключ сортировки

{ 
    "_id" : ObjectId("52de74863fcc41ddfc7b23a5"), 
    "ts" : "1385969614848", 
    "Info" : [ 
     { 
      "out" : 0, 
      "Type" : "1", 
      "Descr" : "Null0", 
     }, 
     { 
      "out" : 10, 
      "Type" : "1", 
      "Descr" : "Null", 
     }, 
     { 
      "out" : 20000, 
      "Type" : "1", 
      "Descr" : "Null0", 
     }, 
     { 
      "out" : 70, 
      "Type" : "10", 
      "Descr" : "abc", 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("52de74863fcc41ddfc7b23a6"), 
    "ts" : "1385969614852", 
    "Info" : [ 
     { 
      "out" : 500, 
      "Type" : "1", 
      "Descr" : "Null0", 
     }, 
     { 
      "out" : 100, 
      "Type" : "1", 
      "Descr" : "Null", 
     }, 
     { 
      "out" : 2896, 
      "Type" : "1", 
      "Descr" : "Null0", 
     }, 
     { 
      "out" : 4052, 
      "Type" : "10", 
      "Descr" : "abc", 
     } 
    ] 
} 

Я хочу, чтобы отсортировать по ключевым «вне». Для того, чтобы сделать это, я написал следующее Монго запрос:

db.collection_name.find({},{"Info.out":1}).sort({"Info.out":1}).pretty()

затем он показывает следующий вывод:

{ 
    "_id" : ObjectId("52fa2922d73ddc832323f402"), 
    "Info" : [ 
     { 
      "out" : 0 
     }, 
     { 
      "out" : 10 
     }, 
     { 
      "out" : 20000 
     }, 
     { 
      "out" : 70 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("52fa292ed73ddc832323f403"), 
    "Info" : [ 
     { 
      "out" : 500 
     }, 
     { 
      "out" : 100 
     }, 
     { 
      "out" : 2896 
     }, 
     { 
      "out" : 4052 
     } 
    ] 
} 

Но я ожидал, что ниже выход:

{ 
    "_id" : ObjectId("52fa2922d73ddc832323f402"), 
    "Info" : [ 
     { 
      "out" : 20000 
     }, 
     { 
      "out" : 70 
     }, 
     { 
      "out" : 10 
     }, 
     { 
      "out" : 0 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("52fa292ed73ddc832323f403"), 
    "Info" : [ 
     { 
      "out" : 4052 
     }, 
     { 
      "out" : 2896 
     }, 
     { 
      "out" : 500 
     }, 
     { 
      "out" : 100 
     } 
    ] 
} 

Кто-нибудь знает, как достичь желаемого результата?

ответ

3

Используя следующую aggregation framework операцию:

db.collection.aggregate([ 
{$project: {_id:1, out: "$Info.out"} }, 
{$unwind: "$out"}, 
{$sort: {_id:1, "out":-1} }, 
{$group: {_id:"$_id" , "Info": { $push: {"out":"$out"}} } } 
]) 

производит:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("52de74863fcc41ddfc7b23a6"), 
      "Info" : [ 
       { 
        "out" : 4052 
       }, 
       { 
        "out" : 2896 
       }, 
       { 
        "out" : 500 
       }, 
       { 
        "out" : 100 
       } 
      ] 
     }, 
     { 
      "_id" : ObjectId("52de74863fcc41ddfc7b23a5"), 
      "Info" : [ 
       { 
        "out" : 20000 
       }, 
       { 
        "out" : 70 
       }, 
       { 
        "out" : 10 
       }, 
       { 
        "out" : 0 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 

Вы также можете проверить:

db.collection.aggregate([ 
{$project: {_id:1, out: "$Info.out"} }, 
{$unwind: "$out"}, 
{$sort: {_id:1, "out":-1} }, 
{$group: {_id:"$_id" , "Info": { $push: "$out"} } } 
]) 

, который выводит данные в каждом документе как «чистый "массив:

{ 
    "_id" : ObjectId("52de74863fcc41ddfc7b23a6"), 
    "Info" : [ 
     4052, 
     2896, 
     500, 
     100 
    ] 
} 
+0

Это прекрасно работает :) – Yogesh

+0

рад помочь! согласитесь ответить пожалуйста :) – Jinxcat

+0

Я сделал mongotry, чтобы визуализировать вывод: http://mongotry.herokuapp.com/#?bookmarkId=52fb8dc14e86f9020071ed73 – bla

Смежные вопросы