Tak, możesz teraz użyć operatora agregacji $objectToArray
(SERVER-23310
), aby zamienić klucze w wartości. Powinien być w stanie policzyć „dynamiczną” liczbę pól. Łącząc ten operator z $addFields
może być bardzo przydatne.
Oba operatory są dostępne w MongoDB v3.4.4+. Na przykładzie powyższych dokumentów:
db.sports.aggregate([
{ $addFields :
{ "numFields" :
{ $size:
{ $objectToArray:"$$ROOT"}
}
}
},
{ $match:
{ numFields:
{$gt:2}
}
}
])
Powyższy potok agregacji najpierw doda pole o nazwie numFields
. Wartość byłaby rozmiarem tablicy. Tablica zawierałaby liczbę pól w dokumencie. Drugi etap filtrowałby tylko 2 pola i więcej (dwa pola, ponieważ nadal istnieje _id
pole plus name
).
W PyMongo , powyższy potok agregacji będzie wyglądał następująco:
cursor = collection.aggregate([
{"$addFields":{"numFields":
{"$size":{"$objectToArray":"$$ROOT"}}}},
{"$match":{"numFields":{"$gt":2}}}
])
Powiedziawszy powyższe, jeśli to możliwe dla twojego przypadku użycia, sugerowałbym ponowne rozważenie modeli danych dla łatwiejszego dostępu. tj. Dodaj nowe pole, aby śledzić liczbę dyscyplin sportowych po wstawieniu/dodaniu nowej pozycji sportowej.