如何在MongoDB中按数组内对象的部分匹配统计文档数?
MongoDB数组对象字段匹配统计方案
推荐方案:直接数组字段查询(性能更优)
不需要使用$expr,直接针对数组内的字段构建查询条件即可,MongoDB会自动识别并匹配数组中存在符合条件元素的文档:
filter = { "seasonToScrap2": season, "events.event_time": "27" } htGoal = db[table].count_documents(filter)
备选方案:使用$expr结合$map+$anyElementTrue
如果业务场景必须使用$expr表达式,可以通过遍历数组元素并判断字段值的方式实现:
filter = { "$expr": { "$and": [ {"$eq": ["$seasonToScrap2", season]}, { "$anyElementTrue": { "$map": { "input": "$events", "as": "event", "in": { "$eq": ["$$event.event_time", "27"] } } }} ] } } htGoal = db[table].count_documents(filter)
原方案问题说明
你之前使用的$in会严格匹配整个对象,只有当数组中存在一个和{"event_time": "27"}完全一致(无其他额外字段)的元素时才会命中,而你的数据中每个event对象还包含team、event等字段,因此无法匹配。
内容的提问来源于stack exchange,提问作者GnomeMage
相关产品推荐
相关产品推荐

