将元数据添加到mongo聚合结果

时间:2018-01-25 16:44:58

标签: mongodb

假设我的mongo集合中有以下条目:

[{a: 1}, {a: 2}, ... {a: 10}]

现在我想写一个只返回几个项目但又返回总计数的聚合。

如果您编写两个聚合,它们看起来像:

[ // meta info about total number of docs that matched
 { $match: {} },
 { $count: 'totalCount' }
]

[ // get first 5
 { $match: {} },
 { $limit: 5 }
] // totalCount should remain 10

是否可以将其组合成一个聚合以安全一些计算时间?

1 个答案:

答案 0 :(得分:1)

您可以使用$facet,它会遍历文档

db.ad.aggregate(
  [
    {
      $facet : {
        metaInfo : [
          { $match : { "a" : 1 } },
          { $group : { _id : null, count : {$sum : 1} } }
        ],
        actualData : [
          { $match : { "a" : 1 } },
          { $limit : 2 }
        ]
      }
    }    
  ]
)

收集(有5个)

> db.ad.find()
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c751"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c752"), "a" : 2 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c753"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c754"), "a" : 4 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c755"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c756"), "a" : 6 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c757"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c758"), "a" : 8 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c759"), "a" : 1 }
{ "_id" : ObjectId("5a6a0f4076b4f3c119a8c75a"), "a" : 10 }
> 

管道返回元数据和实际数据,meta包含所有匹配计数,实际数据已应用$limit

{
    "metaInfo" : [
        {
            "_id" : null,
            "count" : 5
        }
    ],
    "actualData" : [
        {
            "_id" : ObjectId("5a6a0f4076b4f3c119a8c751"),
            "a" : 1
        },
        {
            "_id" : ObjectId("5a6a0f4076b4f3c119a8c753"),
            "a" : 1
        }
    ]
}
> 
相关问题