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"
}
}
} }
])