sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregado de Pymongo:filtrar por número de campos (dinámico)

Sí, ahora puede utilizar un operador de agregación $objectToArray (SERVER-23310 ) para convertir claves en valores. Debería poder contar el número 'dinámico' de campos. Combinando este operador con $addFields podría ser bastante útil.

Ambos operadores están disponibles en MongoDB v3.4.4+ Usando sus documentos anteriores como ejemplo:

db.sports.aggregate([
          { $addFields : 
             { "numFields" : 
               { $size:
                 { $objectToArray:"$$ROOT"}
               }
             }
          }, 
          { $match: 
            { numFields: 
              {$gt:2}
            }
          }
])

La canalización de agregación anterior agregará primero un campo llamado numFields . El valor sería el tamaño de una matriz. La matriz contendría el número de campos en el documento. La segunda etapa filtraría solo para 2 campos o más (dos campos porque todavía hay _id campo más name ).

En PyMongo , la canalización de agregación anterior se vería así:

cursor = collection.aggregate([
                         {"$addFields":{"numFields":
                                         {"$size":{"$objectToArray":"$$ROOT"}}}}, 
                         {"$match":{"numFields":{"$gt":2}}}
         ])

Habiendo dicho lo anterior, si es posible para su caso de uso, sugeriría reconsiderar sus modelos de datos para un acceso más fácil. es decir, agregue un nuevo campo para realizar un seguimiento de la cantidad de deportes cuando se inserta/agrega una nueva posición de deporte.