mongodb - 过滤对象,其中嵌套数组中的所有元素都与条件匹配

时间:2017-09-23 15:49:40

标签: mongodb

使用包含类似

之类的数据库
{  
   "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" } ),它的工作方式是在我的元素中搜索任何等级。

我尝试使用聚合与展开,但它做同样的事情,它打开成绩,过滤,并返回餐厅的任何匹配......

1 个答案:

答案 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所在的那些真