Oui, vous pouvez maintenant utiliser un opérateur d'agrégation $objectToArray
(SERVER-23310
) pour transformer les clés en valeurs. Il devrait être capable de compter le nombre "dynamique" de champs. Combinaison de cet opérateur avec $addFields
pourrait être bien utile.
Les deux opérateurs sont disponibles dans MongoDB v3.4.4+En utilisant vos documents ci-dessus comme exemple :
db.sports.aggregate([
{ $addFields :
{ "numFields" :
{ $size:
{ $objectToArray:"$$ROOT"}
}
}
},
{ $match:
{ numFields:
{$gt:2}
}
}
])
Le pipeline d'agrégation ci-dessus ajoutera d'abord un champ appelé numFields
. La valeur serait la taille d'un tableau. Le tableau contiendrait le nombre de champs dans le document. La deuxième étape filtrerait uniquement pour 2 champs et plus (deux champs car il y a toujours _id
champ plus name
).
Dans PyMongo , le pipeline d'agrégation ci-dessus ressemblerait à :
cursor = collection.aggregate([
{"$addFields":{"numFields":
{"$size":{"$objectToArray":"$$ROOT"}}}},
{"$match":{"numFields":{"$gt":2}}}
])
Cela dit, si possible pour votre cas d'utilisation, je suggérerais de reconsidérer vos modèles de données pour un accès plus facile. c'est-à-dire ajouter un nouveau champ pour garder une trace du nombre de sports lorsqu'une nouvelle position sportive est insérée/ajoutée.