使用包含类似
之类的数据库{
"grades":[
{
"grade":"A",
"score":2
},
{
"grade":"A",
"score":6
},
],
"name":"Morris Park Bake Shop"
},
{
"grades":[
{
"grade":"A",
"score":8
},
{
"grade":"B",
"score":23
}
],
"name":"Wendy'S"
}
如何应用过滤器,只返回所有等级为" A"?
的餐厅如果我试试
db.restaurants.find({ "grades.grade" : "A" } )
,它的工作方式是在我的元素中搜索任何等级。
我尝试使用聚合与展开,但它做同样的事情,它打开成绩,过滤,并返回餐厅的任何匹配......
答案 0 :(得分:1)
在你的情况下我会做这样的事情:
db.getCollection('test').aggregate([
{$unwind:"$grades"},
{ $group: {
_id: '$_id',
grades : { $first: '$grades' },
all_grades: { $sum: 1 },
all_grades_that_match: { $sum: { $cond: [ { $eq: [ '$grades.grade', "A" ] }, 1, 0 ] } },
name: { $first: '$name' }
}},
{ $project: {
_id: 1,
name: 1,
grades: 1,
arrays_equal: { $cond: [ { $eq: [ '$all_grades', '$all_grades_that_match' ] }, 1, 0 ] }
}},
{ $match: { 'arrays_equal' : 1 } }
])
组操作将计算总成绩数和与您查询匹配的成绩数,投影将比较这两个结果以查看它们是否相等,最后,匹配操作将仅保留arrays_equal所在的那些真