如何在投影(项目),mongodb中删除值为null的数组元素

问题描述 投票:0回答:2

我正在尝试从数组中删除null元素,在项目中,尝试使用$ reduce

输入:[“foo”,“bar”,null]

输出:[“foo”,“bar”]

$project: {
    "newArray": { 
        $reduce: {
        input: "$arrayInput",
            initialValue: [],
            in: {
                $concatArrays: [
                    "$$value",
                     {
                         $cond: {
                             if: { $eq: [ "$$this", null ] },
                             then: [],
                             else: ["$$this"]
                         }
                    },
                ]
            }
        }
    }
}
arrays mongodb aggregation-framework projection
2个回答
1
投票

这可以使用$ filter实现

$project: {
    newArray: {
        $filter: {
            input: "$arrayInput",
            as: "a",
            cond: {$ne:["$$a",null]}
            }
        }
    }

0
投票

解决方案1:

我们必须将$$转换为数组([$$ this])并与[null]进行比较

$project: {
    "newArray": { 
        $reduce: {
        input: "$arrayInput",
            initialValue: [],
            in: {
                $concatArrays: [
                    "$$value",
                    {
                         $cond: {
                             if: { $eq: [["$$this"], [null]] },
                             then: [],
                             else: ["$$this"]
                         }
                    },
                ]
            }
        }
    }
}

解决方案2:

如果您想要消除重复值,我们必须在输入值中使用$ setIntersection。

输入:[“foo”,“bar”,null,“foo”,“bar”]

输出:[“foo”,“bar”]

$project: {
    "newArray": { 
        $reduce: {
        input: { "$setIntersection": "$arrayInput" },
            initialValue: [],
            in: {
                $concatArrays: [
                    "$$value",
                    {
                         $cond: {
                             if: { $eq: [["$$this"], [null]] },
                             then: [],
                             else: ["$$this"]
                         }
                    },
                ]
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.