如何使用节点

时间:2016-12-19 07:25:59

标签: node.js mongodb

我想知道如何使用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);
        }
    });
});

您认为我应该怎么做,特别是在我的查询中,解决这个问题?

2 个答案:

答案 0 :(得分:0)

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

此查询应该适合您。试着告诉我它是否有效。

答案 1 :(得分:0)

findfindOne始终返回整个文档,它们不会返回部分/嵌入文档,但您可以轻松访问它们。

您从良好的代码开始,只需要添加访问者:

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
    });
});