如何在MongoDB聚合中过滤数组并生成不含指定元素的新字段
MongoDB聚合$filter筛选数组非指定值的问题解决
你的问题出在三个关键点上:条件运算符使用错误、聚合变量引用错误,以及未保留原数组字段。
问题分析
- 原代码用
$eq作为$filter的条件,这会保留等于"reading"的元素,而你需要的是排除该值,因此要替换为$ne(不等于)运算符。 - 聚合中通过
as定义的临时变量,必须用双美元符号$$引用,原代码里的"$hobby"是错误写法,正确应为"$$hobby"。 - 原
$project阶段未保留原hobbies字段,导致输出缺失该内容,需添加hobbies: 1来保留。
修正后的代码
db.users.aggregate([ { $match: { hobbies: "reading" } }, { $project: { name: 1, age: 1, hobbies: 1, FilteredItems: { $filter: { input: "$hobbies", as: "hobby", cond: { $ne: ["$$hobby", "reading"] } } } } } ]);
执行结果
运行上述代码后,会得到你预期的输出:
[ { "_id": 1, "name": "Alice", "age": 30, "hobbies": ["reading","traveling"], "FilteredItems": ["traveling"] }, { "name": "James", "age": 30, "hobbies": ["reading", "painting"], "FilteredItems": ["painting"] } ]
内容的提问来源于stack exchange,提问作者Yoftahe Abraham
相关产品推荐
相关产品推荐

