2017-01-06 9 views
1

たとえば、departmentというモデルがあります。私は部屋の配列を持っていて、すべての部屋には患者がいます(患者がいます)。配列内のオブジェクトを検索するMongoose

私は、要求IDと等しいpatientnrで患者を取得したいと思います。これを達成する方法はありますか?

var department = mongoose.model('department', { 
    departmentName: String, 
    rooms: [ 
     { 
      roomNumber: String, 
      width: Number, 
      height: Number, 
      posX: Number, 
      posY: Number, 
      sanitary: Boolean, 
      childcareArea: Boolean, 
      lounge: Boolean, 
      patient: { 
       patientnr: Number, 
       firstname: String, 
       lastname: String, 
       reasonOfHospitalization: String, 
       dateOfHospitalization: Date, 
       expectedDateOfDischarge: Date, 
       vegetarian: Boolean, 
       needsHelp: Boolean, 
       comments: String, 
       department: String, 
       roomNumber: String, 
       nextTreatment: { 
        type: String, 
        shortDescription: String, 
        timestamp: Date 
       } 
      } 
     } 
    ] 
}); 

//get patient with id 
app.get('/api/departments/patients/:id', function(req, res) { 
    department.find({"patient": {$all :[60022]}}, function (err, patient) { 
     if (err) 
      res.send(err) 
     res.json(patient); 
    }); 
}); 
+0

ようこそスタックオーバーフロー。あなたに何らかの援助を提供できるようにするためには、解決策を見つけるために何を試みたかを提示すると役に立ちます。また、[このヘルプ記事を読む](http://stackoverflow.com/help/how-to-ask)を参照してください。 –

答えて

1

を試すことができますあなたの投影で$elemMatchを使用することができます。

//get patient with id 
app.get('/api/departments/patients/:id', function(req, res) { 
    department.findOne(
     { "rooms.patient.patientnr": parseInt(req.params.id) }, 
     { 
      "rooms": { 
       "$elemMatch": { 
        "patient.patientnr": parseInt(req.params.id) 
       } 
      } 
     }, 
     function (err, dept) { 
      if (err) 
       res.send(err) 
      var patient = dept.rooms[0].patient; 
      res.json(patient); 
     } 
    ); 
}); 

または$ positional operator

//get patient with id 
app.get('/api/departments/patients/:id', function(req, res) { 
    department.findOne(
     { "rooms.patient.patientnr": parseInt(req.params.id) }, 
     { "rooms.$": 1 }, 
     function (err, dept) { 
      if (err) 
       res.send(err) 
      var patient = dept.rooms[0].patient; 
      res.json(patient); 
     } 
    ); 
}); 

または集計フレームワークを使用します。

//get patient with id 
app.get('/api/departments/patients/:id', function(req, res) { 
    department.aggregate(
     [ 
      { "$match": { "rooms.patient.patientnr": parseInt(req.params.id) } }, 
      { 
       "$project": { 
        "room": { 
         "$arrayElemAt": [ 
          { 
           "$filter": { 
            "input": "$rooms", 
            "as": "room", 
            "cond": { 
             "$eq": [ 
              "$$room.patient.patientnr", 
              parseInt(req.params.id) 
             ] 
            } 
           } 
          }, 0 
         ] 
        } 
       } 
      } 
     ], function (err, results) { 
      if (err) 
       res.send(err) 
      var patient = results[0].room.patient; 
      res.json(patient); 
     } 
    ); 
}); 
+0

ありがとうございます!それは働いた:) – Smut

+0

私は今患者を持っているが、私もその患者の治療を受けるなら、それは非常にいいだろう。今私は治療以外のすべての患者の属性を取得します。 – Smut

+0

緑色のチェックマークのヒントありがとうございます;) – Smut

0

次のように、この

//get patient with id 
app.get('/api/departments/patients/:id', function(req, res) { 
    var id = req.params.id; 
    department.find({"rooms.patient.patientnr": id}, function (err, patient) { 
     if (err) 
      res.send(err) 
     res.json(patient); 
    }); 
}); 
+0

ほとんど、これは私の部屋と患者の部署全体を返します。 しかし、私は患者だけを必要とします。 – Smut

+0

あああなたは患者の体だけを返すのですか? – digit

+0

はい、それが可能なら:) – Smut

関連する問題