Có, bây giờ bạn có thể sử dụng toán tử tổng hợp $objectToArray
( SERVER-23310
) để biến khóa thành giá trị. Nó sẽ có thể đếm số trường 'động'. Kết hợp toán tử này với $ addFields
có thể khá hữu ích.
Cả hai toán tử đều có sẵn trong MongoDB v3.4.4 + Sử dụng tài liệu của bạn ở trên làm ví dụ:
db.sports.aggregate([
{ $addFields :
{ "numFields" :
{ $size:
{ $objectToArray:"$$ROOT"}
}
}
},
{ $match:
{ numFields:
{$gt:2}
}
}
])
Đường dẫn tổng hợp ở trên, trước tiên sẽ thêm một trường có tên là numFields
. Giá trị sẽ là kích thước của một mảng. Mảng sẽ chứa số trường trong tài liệu. Giai đoạn thứ hai sẽ chỉ lọc cho 2 trường trở lên (hai trường vì vẫn còn _id
trường cộng với name
).
Trong PyMongo , đường dẫn tổng hợp ở trên sẽ giống như sau:
cursor = collection.aggregate([
{"$addFields":{"numFields":
{"$size":{"$objectToArray":"$$ROOT"}}}},
{"$match":{"numFields":{"$gt":2}}}
])
Đã nói ở trên, nếu có thể cho trường hợp sử dụng của bạn, tôi khuyên bạn nên xem xét lại mô hình dữ liệu của bạn để truy cập dễ dàng hơn. tức là Thêm một trường mới để theo dõi số lượng môn thể thao khi một vị trí thể thao mới được chèn / thêm.