2017-01-25 10 views
2

私はかなりmongooseを使い慣れています。メイン文書内にサブ文書を返すクエリを作成しようとしています。サブ文書を表示するクエリは機能しません。

マイドキュメント構造は、このようなものです:

「/:私は、プロファイルID及び下位ドキュメントのIDを渡し、私は一つの接点を返すために、次のエンドポイントを書いた

PROFILE 
    - CONTACTS [ARRAY] 

、: owerId/getcontact /:contactId」

マイExpressの機能コードは次のようになります。

router.route('/:ownerId/getcontact/:contactId') 

    .get(function(req, res){ 
     Profile.findOne({'owner_id':req.params.ownerId}).then(function(err, profile){ 
     if(err) 
      res.send(err); 

     profile.findOne({'_id':req.params.contactId}).then(function(err, contact){ 
      if(err) 
      res.send(err); 
      res.json(contact); 
     }) 

     }) 
    }) 

しかし、このコードはプロファイル全体を返します。

IDで取得しようとすると、同じことが行われます。ここに私のコードがあり、それが返され、全体のプロファイルである直下:

router.route('/:ownerId/getcontact/:contactId') 

.get(function(req, res){ 
    Profile.findById(req.params.ownerId).then(function(err, profile){ 
    if(err) 
     res.send(err); 

     var data = profile.contacts.id(req.params.contactId); 

    res.json(data); 

    }) 
}) 





{ 
    "_id": "5886e3692ca4542c453431ee", 
    "initial": "u", 
    "last_name": "randal", 
    "first_name": "chris", 
    "owner_id": "5886e32c2ca4542c453431ed", 
    "__v": 1, 
    "contacts": [ 
    { 
     "last_name": "Eltoro", 
     "first_name": "Peter", 
     "_id": "5886e3f5a219472cac886a9f", 
     "businesses": [], 
     "addresses": [], 
     "phones": [ 
     { 
      "phone_type": "mobile", 
      "phone_number": "555-555-999", 
      "_id": "5886e3f5a219472cac886aa2" 
     }, 
     { 
      "phone_type": "home", 
      "phone_number": "999-876-000", 
      "_id": "5886e3f5a219472cac886aa1" 
     } 
     ], 
     "emails": [ 
     { 
      "email_address": "[email protected]", 
      "_id": "5886e3f5a219472cac886aa0" 
     } 
     ] 
    }, 
    { 
     "college": "University of WA", 
     "highschool": "Kalaheo", 
     "birthday": "1990-12-22T08:00:00.000Z", 
     "last_name": "Smith", 
     "first_name": "Suzanne", 
     "_id": "5886fb7fac288c2e31eabe0a", 
     "businesses": [], 
     "addresses": [ 
     { 
      "zip": "98777", 
      "state": "WA", 
      "city": "Seattle", 
      "address_2": "Apt 234", 
      "address": "124 194th St. SW", 
      "_id": "5886fb7fac288c2e31eabe0e" 
     } 
     ], 
     "phones": [ 
     { 
      "phone_type": "mobile", 
      "phone_number": "206-899-9898", 
      "_id": "5886fb7fac288c2e31eabe0d" 
     }, 
     { 
      "phone_type": "home", 
      "phone_number": "206-789-0987", 
      "_id": "5886fb7fac288c2e31eabe0c" 
     } 
     ], 
     "emails": [ 
     { 
      "email_type": "personal", 
      "email_address": "[email protected]", 
      "_id": "5886fb7fac288c2e31eabe0b" 
     } 
     ] 
    }, 
    { 
     "last_name": "Alabaster", 
     "first_name": "Cindy", 
     "_id": "5888b0bd3c025e54476828d9", 
     "businesses": [], 
     "addresses": [], 
     "phones": [ 
     { 
      "phone_type": "home", 
      "phone_number": "999-999-0909", 
      "_id": "5888b0bd3c025e54476828dc" 
     }, 
     { 
      "phone_type": "home", 
      "phone_number": "000-000-0000", 
      "_id": "5888b0bd3c025e54476828db" 
     } 
     ], 
     "emails": [ 
     { 
      "email_address": "[email protected]", 
      "_id": "5888b0bd3c025e54476828da" 
     } 
     ] 
    } 
    ], 
    "businesses": [], 
    "addresses": [], 
    "phones": [ 
    { 
     "phone_number": "999-999-9999", 
     "phone_type": "mobile", 
     "_id": "5886e37f2ca4542c453431ef" 
    } 
    ], 
    "emails": [] 
} 

答えて

0

マングースサブ文書は、それらを取得するために特別なメソッドを持っています:

router 
    .route('/:ownerId/getcontact/:contactId') 
    .get(function(req, res) { 
     Profile.findOne({ owner_id: req.params.ownerId }, function(err, profile) { 
     if (err) { 
      res.send(err); 
     } 
     var contact = profile.contacts.id(req.params.contactId); 
     res.json(contact); 
     }); 
    }); 

Mongoose Sub Documentsを参照してください。

+0

おかげで、dNitroが、私は同じ結果を得る:

は、あなたのAPIエンドポイントの実装では、以下の集約演算を実行することを検討してください。私の更新を見てください... – cnak2

+0

あなたのプロファイル '_id'が' owner_id'と違うので、 'findById'を使うべきではないので、' findOne'を使うべきです。回答が更新されました。 – dNitro

+0

owneridパラメタを変更して_idを格納しました。私はちょうどparamの名前を変更しませんでした。実際には、_idによってプロファイルを検索しています。私はfindOneとfindByIdを試してきましたが、何らかの理由で、私はまだサブ文書だけでなく、全レコードを取り戻しています。奇妙な。 – cnak2

0

別のルートは、あなたが欲しいデータを返すために$match$arrayElemAt$filter演算子を使用することができ集約フレームワークを使用することです。

router.route('/:ownerId/getcontact/:contactId') 
    .get(function(req, res){ 
     var ownerId = mongoose.Schema.Types.ObjectId(req.params.ownerId), 
      contactId = mongoose.Schema.Types.ObjectId(req.params.contactId); 

     Profile.aggregate([ 
      { "$match": { "owner_id": ownerId } }, 
      { 
       "$project": { 
        "contact": { 
         "$arrayElemAt": [ 
          { 
           "$filter": { 
            "input": "$contacts", 
            "as": "contact", 
            "cond": { "$eq": ["$$contact._id", contactId] } 
           } 
          }, 
          0 
         ] 
        } 
       } 
      } 
     ]).exec(function(err, profile){ 
      if(err) res.send(err);   
      res.json(profile[0].contact); 
     }) 
    }) 
関連する問題