¿Cómo puedo obtener el recuento total de documentos cuando uso la agregación junto con el limit y skip como en la siguiente consulta?
db.Vote.aggregate({ $match: { tid: "e6d38e1ecd", "comment.topic": {$exists: 1}, } },{ $group: { _id: { topic: "$comment.topic", text_sentiment: "$comment.text_sentiment" }, total: {$sum: 1}, } },{ $project: { topic: { name: "$_id.topic", occurence: "$total" }, sentiment: "$_id.text_sentiment" } },{ $sort: {"topic.occurence": -1} }) .skip(SKIP) .limit(LIMIT) Aquí siempre obtendría los documentos limitados por LIMIT , pero en cada consulta, también quiero saber el total de documentos. ¿Cómo puedo hacer eso?
EDITAR Si bien algunos de ustedes han sugerido usar $facet , no estoy seguro de cómo usarlo. Por ejemplo, la agregación devuelve 50 documentos sin límite. ¿Cómo puedo usar $facet modo que no solo devuelva LIMIT documentos sino también los metadatos que contienen el total de documentos?
Aquí hay una consulta de trabajo de MongoDB Playground que creé. ¿Cómo puedo usar $facet o cualquier otro método para obtener el recuento total?
Una opción es usar $facet , pero la desventaja es que agrupará todos sus documentos en un solo documento:
db.Vote.aggregate( {$match: {tid: "e6d38e1ecd", "comment.topic": {$exists: 1}}}, {$group: {_id: {topic: "$comment.topic", text_sentiment: "$comment.text_sentiment"}, total: {$sum: 1}} }, {$project: {topic: {name: "$_id.topic", occurence: "$total"}, sentiment: "$_id.text_sentiment"} }, {$facet: { data: [{$sort: {"topic.occurence": -1}}, {$skip: SKIP}, {$limit: LIMIT}], total: [{ $count: "total" }] }} ) Otra opción es usar $setWindowFields para agregar el conteo total a cada documento, lo que permite mantenerlos como documentos separados:
db.Vote.aggregate( {$match: {tid: "e6d38e1ecd", "comment.topic": {$exists: 1}}}, {$group: {_id: {topic: "$comment.topic", text_sentiment: "$comment.text_sentiment"}, total: {$sum: 1}} }, {$project: {topic: {name: "$_id.topic", occurence: "$total"}, sentiment: "$_id.text_sentiment"} }, { $setWindowFields: {output: {totalCount: {$count: {}}}} }) .skip(SKIP) .limit(LIMIT)