2016-12-19 3 views
0

Я хочу знать, как я могу получить встроенный документ самостоятельно, используя модуль Node и mongojs. Вот некоторые из моего кода для справки:Как получить единый встроенный документ MongoDB с узлом

//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 
    }); 
}); 
Смежные вопросы