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