2013-03-13 69 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

您可以通过$unwind做到这一点的荷兰国际集团阵列updatesdate排序产生的文档,然后使用$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

太棒了!我对聚合非常陌生,并且有一种感觉,它可以做这样的事情。 – 2013-03-13 15:26:03

+0

如果应用程序具有“名称”字段,并且我想将名称保留在结果集中,那么该怎么办? – 2013-03-13 15:57:33

+0

@ user1251624你可以在'$ group'(在'_id'或作为一个单独的字段)和'$ project'中包含该字段。如果你需要更多的帮助,最好把它当作一个单独的问题来讨论,因为它可以是不重要的。 – JohnnyHK 2013-03-13 16:06:18