MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Agregado do Pymongo:filtre por contagem de número de campos (dinâmico)


Sim, agora você pode utilizar um operador de agregação $objectToArray (SERVER-23310 ) para transformar chaves em valores. Deve ser capaz de contar o número 'dinâmico' de campos. Combinando este operador com $addFields poderia ser bastante útil.

Ambos os operadores estão disponíveis no MongoDB v3.4.4+Usando seus documentos acima como exemplo:
db.sports.aggregate([
          { $addFields : 
             { "numFields" : 
               { $size:
                 { $objectToArray:"$$ROOT"}
               }
             }
          }, 
          { $match: 
            { numFields: 
              {$gt:2}
            }
          }
])

O pipeline de agregação acima adicionará primeiro um campo chamado numFields . O valor seria o tamanho de uma matriz. A matriz conteria o número de campos no documento. O segundo estágio filtraria apenas 2 campos e mais (dois campos porque ainda há _id campo mais name ).

Em PyMongo , o pipeline de agregação acima ficaria assim:
cursor = collection.aggregate([
                         {"$addFields":{"numFields":
                                         {"$size":{"$objectToArray":"$$ROOT"}}}}, 
                         {"$match":{"numFields":{"$gt":2}}}
         ])

Dito o que foi dito acima, se possível para o seu caso de uso, sugiro reconsiderar seus modelos de dados para um acesso mais fácil. ou seja, adicionar um novo campo para acompanhar o número de esportes quando uma nova posição esportiva é inserida/adicionada.