Mongodb 对内部数组进行排序

标签 mongodb aggregation-framework

我已经找了一段时间了,似乎无法对内部数组进行排序并将其保留在我当前正在使用的文档中。

{
    "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}});

有人认为他们可以为此提供帮助吗?

最佳答案

您可以通过$unwindupdates数组进行$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'}})

关于Mongodb 对内部数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46055487/

相关文章:

PHP 无法加载动态库 (mongo.so)

mongodb - 父子结果反转

node.js - MongoDB:$lookup 返回空数组

node.js - MongoDB : querying documents with two equal fields, $match 和 $eq

MongoDB操作顺序和变化的获胜方案

mongodb - MongoDB 如何处理嵌套在数组中的对象属性的复合索引?

node.js - MongoDB 连接到远程服务器

mongodb - 不使用 $match 获取条件内数组的大小

Mongodb concat int 和 string

MongoDB 使用链接对象聚合管道