Да, вече можете да използвате оператор за агрегиране $objectToArray
(SERVER-23310
), за да превърне ключовете в стойности. Трябва да може да брои „динамичен“ брой полета. Комбиниране на този оператор с $addFields
може да бъде доста полезно.
И двата оператора са налични в MongoDB v3.4.4+Като използвате вашите документи по-горе като пример:
db.sports.aggregate([
{ $addFields :
{ "numFields" :
{ $size:
{ $objectToArray:"$$ROOT"}
}
}
},
{ $match:
{ numFields:
{$gt:2}
}
}
])
Конвейерът за агрегиране по-горе първо ще добави поле, наречено numFields
. Стойността ще бъде размерът на масив. Масивът ще съдържа броя на полетата в документа. Вторият етап ще филтрира само за 2 полета и повече (две полета, защото все още има _id
поле плюс name
).
В PyMongo , горният тръбопровод за агрегиране ще изглежда така:
cursor = collection.aggregate([
{"$addFields":{"numFields":
{"$size":{"$objectToArray":"$$ROOT"}}}},
{"$match":{"numFields":{"$gt":2}}}
])
Като казах горното, ако е възможно за вашия случай на употреба, бих предложил да преразгледате вашите модели на данни за по-лесен достъп. т.е. добавете ново поле, за да следите броя на спортовете, когато се вмъкне/добави нова спортна позиция.