$count

El $count operador se usa para contar el número de documentos que coinciden con un filtro de consulta especificado. El operador count es útil para resumir datos o generar recuentos para agrupaciones específicas.

Syntax

{
    $count: "<fieldName>"
}

Parámetros

Parámetro Description
<fieldName> Nombre del campo del documento de salida donde se almacenará el recuento.

Examples

Considere este documento de ejemplo de la colección de tiendas.

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

Ejemplo 1: Recuperar el recuento de todos los documentos

Para recuperar el recuento de documentos dentro de la colección, simplemente ejecute una consulta count sin filtros de consulta.

db.stores.aggregate([{
    $count: "totalDocuments"
}])

Esta consulta devuelve el siguiente resultado:

[
    {
        "totalDocuments": 41501
    }
]

Ejemplo 2: Recuento de documentos agrupados por un campo específico

Para recuperar el recuento de documentos dentro de cada categoría de ventas, primero ejecute una consulta para agrupar documentos por categoría de ventas. A continuación, ejecute una consulta de recuento dentro de cada categoría.

db.stores.aggregate([{
        $unwind: "$sales.salesByCategory"
    },
    {
        $group: {
            _id: "$sales.salesByCategory.categoryName",
            totalCount: {
                $count: {}
            }
        }
    }
])

Esta consulta devuelve los siguientes resultados:

[
    {
        "_id": "Christmas Trees",
        "totalCount": 93
    },
    {
        "_id": "Nuts",
        "totalCount": 83
    },
    {
        "_id": "Camping Tables",
        "totalCount": 130
    },
    {
        "_id": "Music Theory Books",
        "totalCount": 52
    },
    {
        "_id": "Fortified Wine",
        "totalCount": 55
    },
    {
        "_id": "Children's Mystery",
        "totalCount": 45
    },
    {
        "_id": "Short Throw Projectors",
        "totalCount": 72
    },
    {
        "_id": "Pliers",
        "totalCount": 56
    },
    {
        "_id": "Bluetooth Headphones",
        "totalCount": 104
    },
    {
        "_id": "Video Storage",
        "totalCount": 80
    },
    {
        "_id": "Cleansers",
        "totalCount": 68
    },
    {
        "_id": "Camera Straps",
        "totalCount": 64
    },
    {
        "_id": "Carry-On Bags",
        "totalCount": 57
    },
    {
        "_id": "Disinfectant Wipes",
        "totalCount": 85
    },
    {
        "_id": "Insignia Smart TVs",
        "totalCount": 81
    },
    {
        "_id": "Toner Refill Kits",
        "totalCount": 38
    },
    {
        "_id": "iPads",
        "totalCount": 51
    },
    {
        "_id": "Memory Foam Mattresses",
        "totalCount": 58
    },
    {
        "_id": "Storage Baskets",
        "totalCount": 68
    },
    {
        "_id": "Body Spray",
        "totalCount": 96
    }
]

Ejemplo 3: Recuento del número de eventos de promoción

Para contar el número de eventos de promoción en todas las tiendas, primero ejecute una consulta para desenredar por eventos de promoción y, a continuación, contar los distintos eventos de promoción.

db.stores.aggregate([{
        $unwind: "$promotionEvents"
    },
    {
        $count: "totalPromotionEvents"
    }
])

Esta consulta devuelve el siguiente resultado:

[
    {
        "totalPromotionEvents": 145673
    }
]

Ejemplo 4: Usar $count en $setWindowFields

Para obtener ventas para promociones de portátiles por tienda, primero ejecute una consulta para filtrar los eventos de promoción de portátiles en 2023. A continuación, particione los almacenes resultantes por empresa. Por último, ejecute una consulta count en los almacenes con particiones para devolver los resultados.

db.stores.aggregate([{
        $unwind: "$promotionEvents"
    },
    {
        $unwind: "$promotionEvents.discounts"
    },
    // Filter only for Laptop discounts in 2023
    {
        $match: {
            "promotionEvents.promotionalDates.startDate.Year": 2023,
            "promotionEvents.discounts.categoryName": "Laptops"
        }
    },
    // Add sales count by city using window function
    {
        $setWindowFields: {
            partitionBy: "$company",
            output: {
                salesCount: {
                    $count: {},
                    window: {
                        documents: ["unbounded", "unbounded"]
                    }
                }
            }
        }
    },
    // Group to return a single result per city
    {
        $group: {
            _id: "$company",
            salesCount: {
                $first: "$salesCount"
            }
        }
    }
])

Esta consulta devuelve los siguientes resultados:

[
    {
        "_id": "VanArsdel, Ltd.",
        "salesCount": 13
    },
    {
        "_id": "Proseware, Inc.",
        "salesCount": 12
    },
    {
        "_id": "Fabrikam, Inc.",
        "salesCount": 11
    },
    {
        "_id": "Contoso, Ltd.",
        "salesCount": 13
    },
    {
        "_id": "Fourth Coffee",
        "salesCount": 8
    },
    {
        "_id": "Trey Research",
        "salesCount": 14
    },
    {
        "_id": "Adatum Corporation",
        "salesCount": 12
    },
    {
        "_id": "Relecloud",
        "salesCount": 16
    },
    {
        "_id": "Lakeshore Retail",
        "salesCount": 13
    },
    {
        "_id": "Northwind Traders",
        "salesCount": 5
    },
    {
        "_id": "First Up Consultants",
        "salesCount": 4
    },
    {
        "_id": "Wide World Importers",
        "salesCount": 7
    },
    {
        "_id": "Tailwind Traders",
        "salesCount": 12
    }
]