2013-03-13 3 views
11

지금 당분간 찾고 있었고 내부 배열을 정렬하고 현재 작업중인 문서에서 그 배열을 유지할 수 없습니다.Mongodb 정렬 내부 배열

{ 
    "service": { 
     "apps": { 
      "updates": [ 
       { 
       "n" : 1 
       "date": ISODate("2012-03-10T16:15:00Z") 
       }, 
       { 
       "n" : 2 
       "date": ISODate("2012-01-10T16:15:00Z") 
       }, 
       { 
       "n" : 5 
       "date": ISODate("2012-07-10T16:15:00Z") 
       } 
      ] 
     } 
    } 
} 

그래서 항목을 서비스로 유지하지만 항목이 정렬 된 상태로 유지하려고합니다. 지금까지 가지고있는 껍질과 함께 :

db.servers.aggregate(
     {$unwind:'$service'}, 
     {$project:{'service.apps':1}}, 
     {$unwind:'$service.apps'}, 
     {$project: {'service.apps.updates':1}}, 
     {$sort:{'service.apps.updates.date':1}}); 

누구나 도움이 될 것이라고 생각합니다.

답변

25

당신은 date에 의해 생성 된 문서를 정렬의 updates 배열을 보내고 $unwind하여이 작업을 수행 한 다음 $group 정렬 순서를 사용하여 _id 함께 그들을 다시 보내고 있습니다.

db.servers.aggregate(
    {$unwind: '$service.apps.updates'}, 
    {$sort: {'service.apps.updates.date': 1}}, 
    {$group: {_id: '$_id', 'updates': {$push: '$service.apps.updates'}}}, 
    {$project: {'service.apps.updates': '$updates'}}) 
+0

굉장! 저는 꽤 집계에 익숙하지 않고 이런 식으로 할 수 있다고 생각했습니다. –

+0

앱에 "이름"과 같은 필드가 있고 그 결과로 이름을 유지하고 싶다면 어떻게해야합니까? –

+0

@ user1251624 당신은'$ group' ('_id' 또는 별도의 필드)과'$ project'에 그 필드를 포함시킬 것입니다. 당신이 더 많은 도움이 필요하다면 그것은 사소한 문제가 될 수 있으므로 별도의 질문으로 질문하는 것이 가장 좋습니다. – JohnnyHK