我想知道如何使用Node和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 :(得分:0)
db.storms.find( { storm: { "$elemMatch": { "stormtime": "14:23" } } } );
此查询应该适合您。试着告诉我它是否有效。
答案 1 :(得分: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
});
});