MongoDB聚合 - 从查找内的数组中仅选择相同的值

Posted

技术标签:

【中文标题】MongoDB聚合 - 从查找内的数组中仅选择相同的值【英文标题】:MongoDB Aggregation - Select only same value from array inside lookup 【发布时间】:2021-12-29 10:57:20 【问题描述】:

我有这样的聚合:

Produk.aggregate([
    
      $lookup: 
        from: "kis_m_kategoriproduks",
        localField: "idSubKategori",
        foreignField: "subKategori._id",
        as: "kategori",
      ,
    ,
     $unwind: "$kategori" ,
     $sort:  produk: 1  ,
    
      $project: 
        _id: 0,
        id: "$id",
        dataKategori: 
          idKategori: "$kategori._id",
          kategori: "$kategori.kategori",
          idSubKategori: "$idSubKategori",
          subKategori: "$kategori.subKategori",
        ,
      ,
    ,
  ])

当前结果是:


    "status": "success",
    "data": [
        
            "dataKategori": 
                "idKategori": "6195bbec8ee419e6a9b8329d",
                "kategori": "Kuliner",
                "idSubKategori": "6195bc0f8ee419e6a9b832a2",
                "subKategori": [
                    
                        "nama": "Food",
                        "_id": "6195bc0f8ee419e6a9b832a2"
                    ,
                    
                        "nama": "Drink",
                        "_id": "6195bc258ee419e6a9b832a8"
                    
                ]
            
        
    ]

我只想在subKategori 中显示_ididSubKategori 匹配的数据。这是我所期望的:


    "status": "success",
    "data": [
        
            "dataKategori": 
                "idKategori": "6195bbec8ee419e6a9b8329d",
                "kategori": "Kuliner",
                "idSubKategori": "6195bc0f8ee419e6a9b832a2",
                "subKategori": [
                    
                        "nama": "Food",
                        "_id": "6195bc0f8ee419e6a9b832a2"
                    
                ]
            
        
    ]

这是我的$kategori 架构:

const schema = mongoose.Schema(
    
      kategori: 
        type: String,
        required: true,
        unique: true,
      ,
      subKategori: [
        
          id: mongoose.Types.ObjectId,
          nama: String,
        ,
      ],
    ,
    
      timestamps: false,
    
  );

有什么建议吗?

【问题讨论】:

使用带有嵌套管道语法的 $lookup 在那里添加额外的过滤器docs.mongodb.com/manual/reference/operator/aggregation/lookup/… 嗨@AlexBlex,感谢您的回复,但您能为我提供一些示例吗?我是 MongoDB 的新手,我不能完全理解文档 【参考方案1】:

我通过在$project 中添加$filter 来解决此问题,如下所示:

  dataKategori: 
    idKategori: "$kategori._id",
    kategori: "$kategori.kategori",
    subKategori: 
      $arrayElemAt: [
        
          $filter: 
            input: "$kategori.subKategori",
            as: "sub",
            cond:  $eq: ["$$sub._id", "$idSubKategori"] ,
          ,
        ,
        0,
      ],
    ,
  ,

参考:https://***.com/a/42490320/6412375

【讨论】:

以上是关于MongoDB聚合 - 从查找内的数组中仅选择相同的值的主要内容,如果未能解决你的问题,请参考以下文章

使用聚合和查找 mongodb 从对象数组中获取最小值

使用聚合和查找 mongodb 从对象数组中获取最小值

Mongodb 查找与聚合匹配返回一个空数组

mongoDB对嵌套对象数组的聚合查找

为啥在与数组中的字段匹配时,mongoDB聚合中的查找中的管道不起作用?

MongoDB:如何使用查找查询填充嵌套对象?