Ja, u kunt nu een aggregatie-operator gebruiken $objectToArray
(SERVER-23310
) om sleutels in waarden om te zetten. Het moet in staat zijn om 'dynamisch' aantal velden te tellen. Deze operator combineren met $addFields
kan best handig zijn.
Beide operators zijn beschikbaar in MongoDB v3.4.4+Uw bovenstaande documenten als voorbeeld gebruiken:
db.sports.aggregate([
{ $addFields :
{ "numFields" :
{ $size:
{ $objectToArray:"$$ROOT"}
}
}
},
{ $match:
{ numFields:
{$gt:2}
}
}
])
De aggregatiepijplijn hierboven voegt eerst een veld toe met de naam numFields
. De waarde zou de grootte van een array zijn. De array zou het aantal velden in het document bevatten. De tweede fase zou alleen filteren op 2 velden en meer (twee velden omdat er nog _id
is veld plus name
).
In PyMongo , zou de bovenstaande aggregatiepijplijn er als volgt uitzien:
cursor = collection.aggregate([
{"$addFields":{"numFields":
{"$size":{"$objectToArray":"$$ROOT"}}}},
{"$match":{"numFields":{"$gt":2}}}
])
Na het bovenstaande te hebben gezegd, zou ik, indien mogelijk voor uw gebruiksscenario, willen voorstellen om uw gegevensmodellen te heroverwegen voor een gemakkelijkere toegang. d.w.z. een nieuw veld toevoegen om het aantal sporten bij te houden wanneer een nieuwe sportpositie wordt ingevoegd/toegevoegd.