我已经嵌套了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" ] }
}
}
}
}])
答案 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"
]
}