如何使用MongoDB访问数组的数组

时间:2019-07-13 14:27:56

标签: json mongodb

我已经嵌套了json数组,并希望使用mongo db查询来获取代码值为M18.1的Patient_ids。

   {"zip":"04903","specialty":"cardiac","number_of_patients":250,"data":[{"gender":"male","age_data":[{"age":1,"diagnostic_data":[{"standard":"ICD","version":"9","disease_info":[{"code":"I15","patient_ids":["101","102","103"]},{"code":"I11","patient_ids":["101","110"]}]},{"standard":"ICD","version":"10","disease_info":[{"code":"M18.1","patient_ids":["101","110","111","112","113"]},{"code":"M19.1","patient_ids":["101","110","111","112","113"]}]}]},{"age":3,"diagnostic_data":[{"standard":"ICD","version":"9","disease_info":[{"code":"I15","patient_ids":["101","102","103"]},{"code":"I11","patient_ids":["101","110"]}]},{"standard":"ICD","version":"10","disease_info":[{"code":"M18.1","patient_ids":["101","110","111","112","113"]},{"code":"M19.1","patient_ids":["101","110","111","112","113"]}]}]}]}]}

我已经尝试使用aggregate,$ elemMatch,$ project和$ filter,它正在处理一级数组。

db.collectionnale.aggregate([
{
"$match" : {
       "data" : {      
               "$elemMatch" : {
                  "$and" : [
                     { "gender" : "male" }
                    ]
                    }
         }
   }
  },{
   "$project" : {
       "specialty":1,
       "data": {                  
          "$filter" : {
             "input" : "$data",
             "as" : "data",
             "cond" : { "$eq" : [ "$$data.gender", "male" ] }

             }
          }
       } 
}])

1 个答案:

答案 0 :(得分:1)

查询嵌套数组并不是那么容易,因此您可以先使用 aggregate 来展开数组,然后应用查询。

db.collectionnale.aggregate([
  { $unwind: "$data" },
  { $unwind: "$data.age_data" },
  { $unwind: "$data.age_data.diagnostic_data" },
  { $unwind: "$data.age_data.diagnostic_data.disease_info" },
  {
    $match:
      { "data.age_data.diagnostic_data.disease_info.code": 'M18.1' }
  },
  {
    "$group": {
      "_id": 0,
      "patientIds": { "$push": "$data.age_data.diagnostic_data.disease_info.patient_ids" }
    }
  },
  {
    "$project": {
      "_id": 0,
      "patientIds": {
        "$reduce": {
          "input": "$patientIds",
          "initialValue": [],
          "in": { "$setUnion": ["$$value", "$$this"] }
        }
      }
    }
  }
])

输出:

 {
        "patientIds" : [ 
            "101", 
            "110", 
            "111", 
            "112", 
            "113"
        ]
    }