MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:come contare il numero di chiavi in ​​un documento?

Abbastanza possibile se si utilizza MongoDB 3.6 e versioni successive tramite il framework di aggregazione. Utilizzare il $objectToArray operatore all'interno di una pipeline di aggregazione per convertire il documento in una matrice. L'array restituito contiene un elemento per ogni coppia campo/valore nel documento originale. Ogni elemento nell'array restituito è un documento che contiene due campi k e v .

Il riferimento per eseguire il root del documento è possibile tramite il $$ROOT variabile di sistema che fa riferimento al documento di primo livello attualmente in fase di elaborazione nella fase della pipeline di aggregazione.

Dopo aver ottenuto l'array, puoi quindi sfruttare l'uso di $addFields passaggio della pipeline per creare un campo che contenga i conteggi e il conteggio effettivo viene derivato con l'uso di $size operatore.

Tutto questo può essere fatto in un'unica pipeline annidando le espressioni come segue:

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

Esempio di output

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

Per escludere il _id campo, puoi utilizzare il $filter operatore come:

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

o come suggerito da 0zkr PM, aggiungi semplicemente un $project passaggio della pipeline all'inizio:

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