MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段

Posted

技术标签:

【中文标题】MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段【英文标题】:MongoDb aggregation for filtering list based on ids and mapping this filtered list to another field 【发布时间】:2020-12-27 05:26:24 【问题描述】:

在我的 mongodb 中,我的数据如下所示:


  "classes": [
    
      "classId": "SSC",
      "studentIds": [
        "1"
      ]
    ,
    
      "classId": "HSC",
      "studentIds": [
        "2",
        "3"
      ]
    
  ],
  "students": [
    
      "_id": "1",
      "student": 
    ,
    
      "_id": "2",
      "student": 
    ,
    
      "_id": "3",
      "student": 
    
  ], 

我想要一个聚合查询,它返回如下所示的数据:

"classes": [
    
      "classId":"SSC",
      "students": [
        
          "id": "1",
          "student": 
        
      ]
    ,
    
      "classId":"HSC",
      "students": [
        
          "id": "2",
          "student": ,
        ,
        
          "id": "3",
          "student": 
        
      ]
    
  ]

在此我有 id 列表。它应该过滤该 id 的学生列表并获取该对象并将该对象放入类数组中。

我已经尝试使用 mongodb 聚合来解决这个问题。但不幸的是,我无法为此编写查询。那么我们可以使用聚合来实现上述场景吗?

我正在使用 Spring Boot mongoTemplate。

【问题讨论】:

【参考方案1】:

你可以使用$map$filter

$map 输入classes 数组创建学生字段并在学生数组中执行$filter 并检查数组中的条件ID
db.collection.aggregate([
  
    $project: 
      classes: 
        $map: 
          input: "$classes",
          as: "c",
          in: 
            classId: "$$c.classId",
            students: 
              $filter: 
                input: "$students",
                cond:  $in: ["$$this._id", "$$c.studentIds"] 
              
            
          
        
      
    
  
])

Playground

【讨论】:

如何使用 MongoTemplate 编写此查询 你的意思是spring mongo模板?如果是,那么我不知道 java spring。 你能帮我解决链接中的聚合查询吗:***.com/questions/64158838/…

以上是关于MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 使用聚合框架过滤深度嵌套的数组

如何在 Mongodb 中对多个数组使用聚合映射和过滤器

MongoDB聚合小tips

MongoDB聚合小tips

使用 $unwind、$lookup 和 $group 的复杂聚合中的 mongodb 正确列表顺序

基于键合并两个数组并使用 mongodb 聚合添加新字段