2016-12-06 66 views
1

我有这样的文件名为诊断集合中的一个阵列内加入数据:MongoDB的对象

{ 
     "_id" : ObjectId("582d43d18ec3f432f3260682"), 
     "patientid" : ObjectId("582aacff3894c3afd7ad4677"), 
     "doctorid" : ObjectId("582a80c93894c3afd7ad4675"), 
     "medicalcondition" : "high fever, cough, runny nose.", 
     "diagnosis" : "Viral Flu", 
     "addmissiondate" : "2016-01-12", 
     "dischargedate" : "2016-01-16", 
     "bhtno" : "125", 
     "prescription" : [ 
      { 
       "drug" : ObjectId("58345e0e996d340bd8126149"), 
       "instructions" : "Take 2 daily, after meals." 
      }, 
      { 
       "drug" : ObjectId("5836bc0b291918eb42966320"), 
       "instructions" : "Take 1 daily, after meals." 
      } 
     ] 
    } 

药物 ID处方对象数组里面是叫药物一个单独的集合,请参阅下面的示例文档:

{ 
    "_id" : ObjectId("58345e0e996d340bd8126149"), 
    "genericname" : "Paracetamol Tab 500mg", 
    "type" : "X", 
    "isbrand" : false 
} 

我想创建一个使用本机node.js驱动程序来获得结果的mongodb查询像这样:

 { 
       "_id" : ObjectId("582d43d18ec3f432f3260682"), 
       "patientid" : ObjectId("582aacff3894c3afd7ad4677"), 
       "doctorid" : ObjectId("582a80c93894c3afd7ad4675"), 
       "medicalcondition" : "high fever, cough, runny nose.", 
       "diagnosis" : "Viral Flu", 
       "addmissiondate" : "2016-01-12", 
       "dischargedate" : "2016-01-16", 
       "bhtno" : "125", 
       "prescription" : [ 
        { 
         "drug" : 
         { 
          "_id" : ObjectId("58345e0e996d340bd8126149"), 
          "genericname" : "Paracetamol Tab 500mg", 
          "type" : "X", 
          "isbrand" : false 
         }, 
         "instructions" : "Take 2 daily, after meals." 
        }, 
        ... 
       ] 
      } 

任何关于如何处理类似结果的建议非常感谢,谢谢。

回答

0

使用聚合框架,您可以创建一个管道,首先压平使用$unwind运营商和$lookup后续的流水线步骤做了“左外连接”上的“药”集合prescription阵列。对“已连接”字段创建的数组应用另一个$unwind操作。 $group以前从第一个管道中展开的文档,其中$unwind运算符为处方数组中的每个元素输出文档。

组装上述管道,运行以下骨料操作:

db.diagnoses.aggregate([ 
    { 
     "$project": {    
      "patientid": 1, 
      "doctorid": 1, 
      "medicalcondition": 1, 
      "diagnosis": 1, 
      "addmissiondate": 1, 
      "dischargedate": 1, 
      "bhtno": 1, 
      "prescription": { "$ifNull" : [ "$prescription", [ ] ] } 
     } 
    }, 
    { 
     "$unwind": { 
      "path": "$prescription", 
      "preserveNullAndEmptyArrays": true 
     } 
    },  
    { 
     "$lookup": { 
      "from": "drugs", 
      "localField": "prescription.drug", 
      "foreignField": "_id", 
      "as": "prescription.drug" 
     } 
    }, 
    { "$unwind": "$prescription.drug" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "patientid" : { "$first": "$patientid" }, 
      "doctorid" : { "$first": "$doctorid" }, 
      "medicalcondition" : { "$first": "$medicalcondition" }, 
      "diagnosis" : { "$first": "$diagnosis" }, 
      "addmissiondate" : { "$first": "$addmissiondate" }, 
      "dischargedate" : { "$first": "$dischargedate" }, 
      "bhtno" : { "$first": "$bhtno" }, 
      "prescription" : { "$push": "$prescription" } 
     } 
    } 
]) 

样本输出

{ 
    "_id" : ObjectId("582d43d18ec3f432f3260682"), 
    "patientid" : ObjectId("582aacff3894c3afd7ad4677"), 
    "doctorid" : ObjectId("582a80c93894c3afd7ad4675"), 
    "medicalcondition" : "high fever, cough, runny nose.", 
    "diagnosis" : "Viral Flu", 
    "addmissiondate" : "2016-01-12", 
    "dischargedate" : "2016-01-16", 
    "bhtno" : "125", 
    "prescription" : [ 
     { 
      "drug" : { 
       "_id" : ObjectId("58345e0e996d340bd8126149"), 
       "genericname" : "Paracetamol Tab 500mg", 
       "type" : "X", 
       "isbrand" : false 
      }, 
      "instructions" : "Take 2 daily, after meals." 
     }, 
     { 
      "drug" : { 
       "_id" : ObjectId("5836bc0b291918eb42966320"), 
       "genericname" : "Paracetamol Tab 100mg", 
       "type" : "Y", 
       "isbrand" : false 
      }, 
      "instructions" : "Take 1 daily, after meals." 
     } 
    ] 
} 
+0

我遇到了一个小问题就与此查询,如果没有处方数据的含义该数组不在文件中,查询不会返回任何内容,是否有某种方法可以使其像左连接一样工作? – VindulaF

+1

@VindulaFernando用一种方法更新了答案。请检查。 – chridam

+0

仍然得到同样的结果我的诊断文件看起来像这样在那种情况下 '{ “_id”:物件( “582d43d18ec3f432f3260682”), “patientid”:物件( “582aacff3894c3afd7ad4677”), “doctorid”:物件(” “addmissiondate”:“2016-01-12”, “已排出”:“2016年12月12日” -01-16“, ”bhtno“:”125“ }' – VindulaF