2016-12-19 2 views
0

Ich möchte wissen, wie ich ein eingebettetes Dokument allein mit Node und Mongojs Modul bekommen kann. Hier einige von meinen Code als Referenz:Abrufen einzelner MongoDB Embedded Document mit Knoten

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

Dort kann ich durch die Objekt-ID bekommen, aber was ich tun möchte, bekommen, ist ein eingebettetes Objekt durch eine andere Eigenschaft als ID.

Hier ist eine Sammlung Referenz:

{ 
    "_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"} 
    ] 
} 

Ich habe versucht, den Code unten, aber es funktioniert nicht. Ich möchte wie oben über die URL auf die Immobilie zugreifen können.

Was sollte ich tun, vor allem in meiner Abfrage, um dieses Problem zu lösen?

Antwort

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

Diese Abfrage sollte für Sie arbeiten. Versuchen Sie es einfach und lassen Sie es mich wissen, wenn es funktioniert.

0

find und findOne geben immer ganze Dokumente zurück, sie geben keine partiellen/eingebetteten Dokumente zurück, aber Sie können einfach darauf zugreifen.

Sie mit gutem Code gestartet, müssen nur die Accessor hinzuzufügen:

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