首页 > 解决方案 > 投影中的 Mongo Compaas 过滤器

问题描述

最近,我在 Mongo Compass 中创建查询时面临挑战。下面是场景。我在 mongo db 中有一组文档,如下所示:

{
  _id :1,
  'people':[
   {
     'grade' : ['A','B'],
     'stream': [ {
          'stream_id: 'CSE',
          'stream_name': 'COMPUTER'
           },
          {
          'stream_id: 'ECE',
          'stream_name': 'ELECTRONICS'
          },
          ]
   },
   {
    'grade' : ['B'],
    'stream': [ {
            'stream_id: 'IT',
            'stream_name': 'INFORMATION_TECH'
             }
             ]
    }

  ]
}

我需要找到等级为“A”且流名称为“CSE”的“人”元素。所以基本上我想要这个输出:

{
_id :1,
'people':[
{
'grade' : ['A','B'],
'stream': [ {
'stream_id: 'CSE',
'stream_name': 'COMPUTER'
}
]
]}

我已经尝试了所有 $elemMatch 功能,但它不仅返回了整个文档,而且不仅返回了数组的特定索引。如果有人知道 mongo 指南针,请告诉我。

Mongo 看起来很有趣 :)

标签: mongodb

解决方案


您可以使用聚合

  • $unwind解构数组
  • $match获得必要的文件,其他人将被淘汰
  • $filter过滤流,因为我们得到了所有通过条件的文档,我们需要过滤等于条件的流对象
  • $group重建我们在第一步中已经解构的数组

这是代码

db.collection.aggregate([
  { $unwind: "$people" },
  {
    $match: {
      $expr: {
        $and: [
          { $in: [  "A", "$people.grade" ] },
          { $in: [ "CSE", "$people.stream.stream_id" ] }
        ]
      }
    }
  },
  {
    $addFields: {
      "people.stream": {
        $filter: {
          input: "$people.stream",
          cond: { $eq: [ "$$this.stream_id", "CSE" ] }
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      people: { $push: "$people" }
    }
  }
])

工作蒙戈游乐场


推荐阅读