You can use $facet
for this, it traverse the document once
db.ad.aggregate(
[
{
$facet : {
metaInfo : [
{ $match : { "a" : 1 } },
{ $group : { _id : null, count : {$sum : 1} } }
],
actualData : [
{ $match : { "a" : 1 } },
{ $limit : 2 }
]
}
}
]
)
collection (has 5 a's )
> 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 }
>
pipeline returned meta and actual data, meta has all the matching count and actual data has $limit
applied
{
"metaInfo" : [
{
"_id" : null,
"count" : 5
}
],
"actualData" : [
{
"_id" : ObjectId("5a6a0f4076b4f3c119a8c751"),
"a" : 1
},
{
"_id" : ObjectId("5a6a0f4076b4f3c119a8c753"),
"a" : 1
}
]
}
>