如何修改Python环境下MongoDB聚合pipeline获取全部数组元素而非首个元素
问题根源
你当前仅返回单个元素是因为两个分支都调用了数组单元素提取操作:
valid != 'no'的分支使用$first提取过滤后数组的首个元素valid == 'no'的分支使用$arrayElemAt提取数组下标为0的首个元素
修改方案
要返回所有符合条件的数组元素,直接移除这两个单元素提取操作即可:
- 第一个分支直接保留
$filter的返回结果($filter本身就会返回所有满足条件的元素组成的数组) - 第二个分支可根据需求调整:如果
valid为no时需要返回完整的positions数组,直接返回$positions即可;如果该场景下也需要过滤已删除元素,替换为对应$filter逻辑即可。
修改后代码示例:
{'$project': { '_id': 1, "tag": '$abc', "service": 1, "rec_id": 1, "valid": 1, "position": {'$switch': { 'branches': [ { 'case': {'$ne': ['$valid','no']}, # 移除$first,直接返回过滤后的全量符合条件元素 'then': { '$filter': { 'input': '$positions', 'as': 'pc', 'cond': {"$eq": ["$$pc.deleted", False]} } } }, { 'case': {'$eq': ['$valid', 'no']}, # 移除$arrayElemAt,直接返回全量positions,如需过滤可替换为上方filter逻辑 'then': '$positions' }, ] }} }}
注:如果
valid为no时也需要仅返回deleted为false的元素,将第二个分支的then值替换为和第一个分支相同的$filter代码即可。
内容的提问来源于stack exchange,提问作者Harshitha Shekar
相关产品推荐
相关产品推荐

