Sì, ora puoi utilizzare un operatore di aggregazione $objectToArray
(SERVER-23310
) per trasformare le chiavi in valori. Dovrebbe essere in grado di contare il numero "dinamico" di campi. Combinando questo operatore con $addFields
potrebbe essere abbastanza utile.
Entrambi gli operatori sono disponibili in MongoDB v3.4.4+Utilizzando i documenti sopra come esempio:
db.sports.aggregate([
{ $addFields :
{ "numFields" :
{ $size:
{ $objectToArray:"$$ROOT"}
}
}
},
{ $match:
{ numFields:
{$gt:2}
}
}
])
La pipeline di aggregazione sopra, prima aggiungerà un campo chiamato numFields
. Il valore sarebbe la dimensione di un array. L'array conterrà il numero di campi nel documento. La seconda fase filtrerebbe solo per 2 campi e più (due campi perché c'è ancora _id
campo più name
).
In PyMongo , la pipeline di aggregazione sopra sarebbe simile a:
cursor = collection.aggregate([
{"$addFields":{"numFields":
{"$size":{"$objectToArray":"$$ROOT"}}}},
{"$match":{"numFields":{"$gt":2}}}
])
Detto quanto sopra, se possibile per il tuo caso d'uso, suggerirei di riconsiderare i tuoi modelli di dati per un accesso più facile. ovvero aggiungere un nuovo campo per tenere traccia del numero di sport quando viene inserita/aggiunta una nuova posizione sportiva.