yewanji 2023-01-07 08:59 采纳率: 37.9%
浏览 46
已结题

mongodb 嵌套查询如何过滤掉不符合条件的数据

假如有一个年级集合。年级下面有很多学生

[
  {
    "_id": "1",
    "gradeName": "一年级",
    "students": [
      {
        "name": "张三",
        "age": "18"
      },
      {
        "name": "张三丰",
        "age": "88"
      },
      {
        "name": "李四"
      }
    ]
  },
  {
    "_id": "2",
    "gradeName": "二年级",
    "students": [
      {
        "name": "老王",
        "age": "18"
      },
      {
        "name": "老李",
        "age": "88"
      },
      {
        "name": "老张",
        "age": 28
      }
    ]
  }
]

我想查询姓张的同学的所有年级,且子集里面只包含姓张的同学
期待的返回结果如下

{
    "_id": "1",
    "gradeName": "一年级",
    "students": [
      {
        "name": "张三",
        "age": "18"
      },
      {
        "name": "张三丰",
        "age": "88"
      }
    ]
  }

  • 写回答

5条回答 默认 最新

  • 阳光宅男xxb 2023-01-07 09:07
    关注

    方法一:使用$unwind将数组打散,获取结果集后用$match筛选符合条件的数据,最后使用$group进行聚合获取最终结果集。
    方法二:使用$match过滤符合条件的根文档结果集,然后使用$project返回对应字段的同时,在数组中使用$filter进行内部过滤,返回最终结果集

    这个文章很适合你:https://www.51sjk.com/b91b129138/

    望采纳,望采纳!祝你的问题早日解决!!!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • Minuw 2023-01-07 09:04
    关注
    评论 编辑记录
  • heart_6662 2023-01-07 09:57
    关注

    望采纳!!!点击回答右侧采纳即可采纳!!!(java写的一个程序给你兄弟
    代码:

    List<Map<String, Object>> grades = new ArrayList<>();
    // 假设上面的年级集合已经存在,且为grades
    
    List<Map<String, Object>> result = new ArrayList<>();
    for (Map<String, Object> grade : grades) {
      List<Map<String, Object>> students = (List<Map<String, Object>>) grade.get("students");
      List<Map<String, Object>> zhangStudents = students.stream()
          .filter(student -> student.get("name").toString().startsWith("张"))
          .collect(Collectors.toList());
      if (!zhangStudents.isEmpty()) {
        Map<String, Object> filteredGrade = new HashMap<>(grade);
        filteredGrade.put("students", zhangStudents);
        result.add(filteredGrade);
      }
    }
    
    System.out.println(result);
    
    
    

    结果:

    
    [  {    "_id": "1",    "gradeName": "一年级",    "students": [      {        "name": "张三",        "age": "18"      },      {        "name": "张三丰",        "age": "88"      }    ]
      }
    ]
    
    
    评论
  • |__WhoAmI__| 2023-01-07 11:04
    关注
    db.grades.find({
        'students': {
            '$elemMatch': {
                'name': {
                    '$regex': '^张'
                }
            }
        }
    }, {
        '_id': 1,
        'gradeName': 1,
        'students': {
            '$elemMatch': {
                'name': {
                    '$regex': '^张'
                }
            }
        }
    })
    

    仅供参考,望采纳,谢谢。

    评论
  • Marco119 2023-01-07 11:17
    关注

    MongoDB 的嵌套查询是通过在查询语句中使用管道符来实现的。

    例如,假设你有如下所示的一个集合:

    {
      _id: 1,
      name: 'John',
      age: 20,
      address: {
        street: '123 Main Street',
        city: 'New York',
        state: 'NY'
      }
    }
    {
      _id: 2,
      name: 'Jane',
      age: 25,
      address: {
        street: '456 Maple Street',
        city: 'Chicago',
        state: 'IL'
      }
    }
    {
      _id: 3,
      name: 'Bob',
      age: 30,
      address: {
        street: '789 Pine Street',
        city: 'Los Angeles',
        state: 'CA'
      }
    }
    
    

    你可以使用管道符来过滤出 age 大于 25 岁的文档,如下所示:

    db.collection.find({ age: { $gt: 25 } })
    
    

    如果你想过滤出 address.state 等于 'NY' 的文档,可以这样写:

    db.collection.find({ 'address.state': 'NY' })
    
    

    如果你想结合这两种过滤条件,可以使用 $and 操作符,如下所示:

    db.collection.find({ $and: [{ age: { $gt: 25 } }, { 'address.state': 'NY' }] })
    
    

    希望这些信息能够帮助你!

    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月7日

悬赏问题

  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 c语言练习:统计词频
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色
  • ¥50 监控摄像头 乐橙和家亲版 保存sd卡的文件怎么打开?视频怎么播放?
  • ¥15 Python的Py-QT扩展库开发GUI
  • ¥60 提问一下周期性信信号的问题
  • ¥15 jtag连接不上fpga怎么办