2016-12-19 9 views
0
を持つ単一のMongoDB組み込みドキュメントを取得する方法

ノードとmongojsモジュールを使用して埋め込みドキュメントを単独で取得する方法を知りたいと思います。ここに参照のための私のコードの一部です:ノード

//Gets by ID 
router.get('storm/:id',function(req,res,next){ 
    db.storms.findOne({_id:mongojs.ObjectId(req.params.id)},function(err,storm){ 
     if (err){ 
      res.send(err); 
     } 
     else { 
      res.json(storm); 
     } 
    }); 
}); 

あり、私は、オブジェクトIDによって取得することができ、しかし、私は何をしたいID以外のプロパティで埋め込みオブジェクトを取得することです。ここで

は参照用のコレクションです:

{ 
    "_id":"585761e497a4739e937fad8d", 
    "user":"lloyd", 
    "timestamp":"14:20", 
    "storm": 
    [ 
      {"message":"This is a test message number 7. I love making test messages.","stormtime":"14:21"}, 
      {"message":"This is a test message number 8. I love making test messages.","stormtime":"14:22"}, 
      {"message":"This is a test message number 9. I love making test messages.","stormtime":"14:23"} 
    ] 
} 

は、私は以下のコードを試してみましたが、それは動作しません。私は上記のURLのようにプロパティにアクセスできるようにしたい。

//Get messages in storm 
router.get('storm/:stormtime',function(req,res,next){ 
    db.storms.find({"storm.stormtime":"14:23"},{"storm.$":1},function(err,storm){ 
     if (err){ 
      res.send(err); 
     } 
     else { 
      res.json(storm); 
     } 
    }); 
}); 

この問題を解決するために、特に私のクエリではどうすればよいと思いますか?

答えて

0
db.storms.find({ storm: { "$elemMatch": { "stormtime": "14:23" } } }); 

このクエリはあなたに適しています。試してみてください。

0

findおよびfindOneは、常に完全なドキュメントを返しますが、部分/埋め込みドキュメントは返されませんが、簡単にアクセスできます。

あなたは、良いコードで開始ちょうどアクセサを追加する必要があります。

router.get('storm/:stormtime',function(req,res,next){ 
    db.storms.find({"storm.stormtime":"14:23"},{"storm.$":1},function(err, doc){ 
     if (err || !doc) return res.send(err || "no doc"); 
     res.json(doc.storm[0]); // This accesses the embedded object you want 
    }); 
});