MongoDB基于嵌套数组值过滤文档数组元素的技术问题
解决MongoDB聚合中过滤嵌套数组的问题
你遇到的问题是因为$filter的input参数写错啦——你用了$lessons.subject,这相当于把所有lesson的subject数组扁平化处理了,而不是遍历每个完整的lesson对象。我们需要调整$filter的目标,直接遍历lessons数组,然后检查每个lesson的subject是否包含"Order",如果不包含就保留它。
正确的聚合管道应该是这样的:
db.students.aggregate([ { $project: { lessons: { $filter: { input: "$lessons", // 遍历整个lessons数组 as: "lesson", // 把每个元素命名为lesson cond: { // 判断当前lesson的subject数组不包含"Order" $not: { $in: ["Order", "$$lesson.subject"] } } } } } } ])
代码解释:
input: "$lessons":指定要过滤的是顶层的lessons数组,每个元素是一个完整的lesson对象as: "lesson":给当前遍历的lesson对象起一个别名,方便后续引用cond部分:用$in检查"Order"是否在当前lesson的subject数组中,再用$not取反,这样就会保留所有**不包含"Order"**的lesson对象
执行这个聚合管道后,就能得到你想要的结果:
{ "_id" : ObjectId("...some id"), "lessons" : [ { "date" : ISODate("2019-09-24T16:00:00.000+02:00"), "subject" : [ "Javascript" ], "price" : 120 } ] }
内容的提问来源于stack exchange,提问作者Kurs Google
相关产品推荐
相关产品推荐

