MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :comment compter le nombre de clés dans un document ?

Tout à fait possible si vous utilisez MongoDB 3.6 et plus récent via le framework d'agrégation. Utilisez le $objectToArray opérateur dans un pipeline d'agrégation pour convertir le document en tableau. Le tableau de retour contient un élément pour chaque paire champ/valeur du document d'origine. Chaque élément du tableau de retour est un document qui contient deux champs k et v .

La référence à la racine du document est rendue possible grâce au $$ROOT variable système qui fait référence au document de niveau supérieur en cours de traitement dans l'étape de pipeline d'agrégation.

Lors de l'obtention du tableau, vous pouvez alors tirer parti de l'utilisation de $addFields étape de pipeline pour créer un champ qui contient les décomptes et le décompte réel est dérivé à l'aide de $size opérateur.

Tout cela peut être fait dans un seul pipeline en imbriquant les expressions comme suit :

db.collection.aggregate([
    { "$addFields": {
        "count": {
            "$size": { 
                "$objectToArray": "$$ROOT"
            }
        }
    } }     
])

Exemple de sortie

{
    "_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
    "a" : 1.0,
    "b" : 1.0,
    "c" : 2.0,
    "z" : 2.0,
    "count" : 5
}

Pour exclure le _id champ, vous pouvez utiliser le $filter opérateur en tant que :

db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$ne": [ "$$el.k", "_id" ] }
                    }
                }
            }
        }
    }     
])

ou comme suggéré par 0zkr PM ajoutez simplement un $project étape du pipeline au début :

db.collection.aggregate([
    { "$project": { "_id": 0 } },
    { "$addFields": {
        "count": {
            "$size": { 
                "$objectToArray": "$$ROOT"
            }
        }
    } }     
])