首页 > 解决方案 > MongoError:向数组元素添加新字段时无法识别表达式 $addFields

问题描述

在一个集合中,我有一个文档,其中一个字段等于包含另一个文档的数组(“类别”),在下面的代码中为什么我会收到以下错误:MongoError: Unrecognized expression '$addFields'

dbUsers.aggregate([
        {
            $match: {
                key: req.cookies.key
            }
        }, {
            $project: {
                categories: {
                    $map: {
                        input: {
                            $filter: {
                                input: '$categories',
                                as: 'category',
                                cond: { $eq: ['$$category.parentId', req.headers.parentid] }
                            }
                        },
                        as: 'current',
                        in: {
                            $addFields: {
                                countOfIntelligence: {
                                    $size: '$$current.listOfIntelligences'
                                }
                        }}
                    }
                }
            }
        }
    ]).toArray((err, res2) => {
        if (err) {
            console.log(err)
        } else {
            res.send({
                categories: res2
            })
        }
    })

标签: node.jsmongodbmongodb-queryaggregation-framework

解决方案


$addFields是一个聚合阶段,您不能将其用作那里的运算符,如果您想为数组中的每个子文档添加一个字段并使用更新的子文档重新创建数组本身,请尝试以下查询:

dbUsers.aggregate([
    {
        $match: {
            key: req.cookies.key
        }
    }, {
        $project: {
            categories: {
                $map: {
                    input: {
                        $filter: {
                            input: '$categories',
                            as: 'category',
                            cond: { $eq: ['$$category.parentId', req.headers.parentid] }
                        }
                    },
                    as: 'current',
                    in: {
                        $mergeObjects: ['$$current', {
                            countOfIntelligence: {
                                $size: '$$current.listOfIntelligences'
                            }
                        }]
                    }
                }
            }
        }
    }
]).toArray((err, res2) => {
    if (err) {
        console.log(err)
    } else {
        res.send({
            categories: res2
        })
    }
})

参考 : $addFields , $mergeObjects


推荐阅读