Nodejs mongoose select 对象具有基于对象属性的嵌套数组

Nodejs mongoose select objects with in nested arrays based on object properties

我是 nodejs 的新手,目前我正在尝试使用 nodejs 和 mongodb (mongoose) 来实现一个网络应用程序。

我想 select 基于这些对象的 属性 个嵌套数组和父数组中的对象。

简单 - 我需要 select 具有有效 属性 的类别和 sub_services 具有有效 属性 的类别。 (在一个类别中,不能有 sub_services 有效 属性 为假,也不能有类别对象有效 属性 为假。)

架构

var VendorSchema = new Schema({

  _id: {
        type: Schema.Types.ObjectId,
        ref: "User"
    },


  services: {

        meta_data: {
              allowed_category_count: {
                     type: Number,
                     default: 1
              }
        },

        categories: [{

              _id:false,

              valid :{
                     type: Boolean,
                     default: false
              },

              service_category: {             
                     type: Schema.Types.ObjectId,
                     ref: "ServiceCategory"
              },

              sub_services :[{
                     _id:false,

                     valid :{
                            type: Boolean,
                            default: false
                     },

                     service : {
                            type: Schema.Types.ObjectId,
                            ref: "Service"
                     }                          
              }]       
        }]
  },

});

查询

 router.get('/get_service_details',function(req, res) {
     Vendor.findOne({ _id: req.user._id,'services.categories.valid': true,'services.categories.sub_services.valid': true},'services').
                exec(function (err, story) {
                    if (err) {
                        console.log(err);
                        return (err);
                    }
                    else{
                        res.send(story);
                    }   
                }) 
    });

上述查询的结果

{
    "_id": "5a62ea5d7515222464e20016",
    "services": {
        "categories": [
            {
                "service_category": {
                    "_id": "5a609b40c9a5e50d844838bf"
                },
                "sub_services": [
                    {
                        "service": {
                            "_id": "5a609f7ac9a5e50d844838c1"                            
                        },
                        "valid": true
                    },
                    {
                        "service": {
                            "_id": "5a609f7ac9a5e50d844838c1"
                        }
                        "valid": false
                    }
                ],
                "valid": true
           },
           {
             "service_category": {
                    "_id": "5a609b4ac9a5e50d844838c0"
             },
             "sub_services": [
                    {
                        "service": {
                            "_id": "5a609f84c9a5e50d844838c2"
                        }
                        "valid": true
                    }
             ],
             "valid": false
           }
       ]
    }
}

预期结果

{
    "_id": "5a62ea5d7515222464e20016",
    "services": {
        "categories": [
            {
                "service_category": {
                    "_id": "5a609b40c9a5e50d844838bf"
                },
                "sub_services": [
                    {
                        "service": {
                            "_id": "5a609f7ac9a5e50d844838c1"                            
                        },
                        "valid": true
                    }
                ],
                "valid": true
             }
           ]
    }
}

谁能帮我解决这个问题。

使用 $filter 表达式过滤类别作为 $map 的输入,将输出值映射到 $filtered sub_services。

 Vendor.aggregate([
  {"$match":{"_id":mongoose.Types.ObjectId(req.user._id), "services.categories.valid": true, "services.categories.sub_services.valid": true}},
  {
    "$addFields": {
      "services.categories": {
        "$map": {
          "input": {
            "$filter": {
              "input": "$services.categories",
              "as": "categoryf",
              "cond": "$$categoryf.valid"
            }
          },
          "as": "categorym",
          "in": {
            "service_category": "$$categorym.service_category",
            "valid": "$$categorym.valid",
            "sub_services":{
                 "$filter": {
                 "input": "$$categorym.sub_services",
                 "as": "sub_services",
                "cond": "$$sub_services.valid"
               }
             }
          }
        }
      }
    }
  }
])