MongoDB:$project 和 $filter,包括所有其他属性

标签 mongodb aggregation-framework

我正在使用包含 $project 阶段的 MongoDB 聚合查询,该阶段包含 $filter 运算符:

[
    '$project' => [
        'array' => [
            '$filter' => [
                'input' => '$array',
                'as' => 'array',
                'cond' => [
                    '$in' => [
                        "value",
                        '$$array.subarray'
                    ]
                ]
            ]
        ]
    ]
]

这将过滤掉子数组中不具有特定值的所有数组元素。

虽然这按预期工作,但这也会从聚合查询中删除所有其他字段,并且只将数组字段传递到下一阶段。我怎样才能告诉 $project 阶段除了过滤那些数组元素之外不要删除任何其他字段?

我读到排除单个字段会导致包含所有其他字段,但除此之外我没有要排除的字段,我无法向此 $project< 添加排除操作 阶段,因为 $filter 操作已经充当输入操作,您不能将两者混用。有什么想法吗?

最佳答案

使用 $addFields 聚合阶段而不是 $project$addFields manual阅读:

The $addFields stage is equivalent to a $project stage that explicitly specifies all existing fields in the input documents and adds the new fields.

因此,只需将代码中的 $project 替换为 $addFields 即可实现所需的行为。

这是@Veeram 在评论中建议的。

关于MongoDB:$project 和 $filter,包括所有其他属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54835395/

相关文章:

mongodb - 如何在 MongoDB 中更新文档并避免重复?

arrays - 如何在 MongoDb Compass 查询内部对象集合内执行大于运算符

java - 在java中将包括$cond的聚合转换为DBObject

mongodb - 如何更新 MongoDB 中的重复文档?

mongodb - 在 MongoDB 中保存常见聚合

node.js - 如何在我的 Mongoose 模式中引用另一个模式?

node.js - “无法找到该编队”heroku 部署错误

javascript - Mongoose 独特的结果

java - 如何使用 java 驱动程序将文档与 mongodb 中的现有数组元素匹配

mongodb - $unwind 聚合框架中的对象