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.