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

Agrégat Pymongo :filtrer par nombre de champs (dynamique)

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.