2016-04-08 21 views
2

ich ein paar Stunden mit reichlich console.logs verbracht habe versucht, herauszufinden, warum dies nicht funktioniert und Grund bin etwas fehlt hier:Mongoose Subdokument - ID nicht gefunden

Das Szenario ist von Simon Holmes' Buch auf MEAN bekommen (Kapitel 6). Entschuldigungen für das Kopieren der gesamten Funktion, aber ich wollte sicherstellen, dass ich nicht etwas Offensichtliches vermisste.

Ich habe ein Schema wie folgt definiert:

var mongoose = require('mongoose'); 

var reviewSchema = new mongoose.Schema({ 
    author: String, 
    rating: { type: Number, required: true, min: 0, max: 5 }, 
    reviewText: String, 
    createdOn: { type: Date, "default": Date.now } 
}); 

var openingTimeSchema = new mongoose.Schema({ 
    days: { type: String, required: true }, 
    opening: String, 
    closing: String, 
    closed: { type: Boolean, required: true } 
}); 

var locationSchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    address: String, 
    rating: { type: Number, "default": 0, min: 0, max: 5 }, 
    facilities: [String], 
    // Always store coordinates longitude, latitude order. 
    coords: { type: [Number], index: '2dsphere' }, 
    openingTimes: [openingTimeSchema], 
    reviews: [reviewSchema] 
}); 

mongoose.model('Location', locationSchema); 

und einige Code, um einen einzigen Standort mit einer bestimmten Bewertung zu lesen:

module.exports.reviewsReadOne = function(req, res) { 
    console.log('locationid = ' + req.params.locationid); 
    console.log('reviewid = ' + req.params.reviewid); 
    if (req.params && req.params.locationid && req.params.reviewid) { 
     Loc 
      .findById(req.params.locationid) 
      .select('name reviews') 
      .exec (
       function(err, location) { 
        var response, review; 
        if (!location) { 
         sendJsonResponse(res, 404, { 
          "message" : "locationid not found" 
         }); 
         return; 
        } else if (err) { 
         sendJsonResponse(res, 400, err); 
         return; 
        } 
        console.log('reviews = ' + location.reviews); 
    // Note the rating here... 
        console.log('#0.rating = ', location.reviews[0].rating); 
    // Note the id here... 
        console.log('#0.id = ', location.reviews[0].id); 
        if (location.reviews && location.reviews.length > 0) { 
         review = location.reviews.id(req.params.reviewid); 
         console.log('returned review = ' + review); 
         if (!review) { 
          sendJsonResponse(res, 404, { 
           "message" : "reviewid not found" 
          }); 
         } else { 
          response = { 
           location: { 
            name : location.name, 
            id : req.params.locationid 
           }, 
           review : review 
          }; 
          sendJsonResponse(res, 200, response); 
         } 
        } else { 
         sendJsonResponse(res, 404, { 
          "message" : "No reviews found" 
         }); 
        } 
       } 
      ); 
    } else { 
     sendJsonResponse(res, 404, { 
      "message" : "Not found, locationid and reviewid are both required"});  
    } 
}; 

Mit Google Postman, mache ich eine Anfrage an die API :

localhost:3000/api/locations/5706bbc7b47a0b25981d3a40/reviews/5706bd65b47a0b25981d3a41 

Aber ich bekomme eine Antwort von

Was mich hier verwirren ist, dass ich glaube, dass ich die korrekte Überprüfung Filialdokument ID referenzieren, aber die JSON, die dies zeigt, Jesse, Javascript sieht es nicht, und könnte erklären, warum die Mungo-Funktion wird es nicht zurückgeben :

das ist meine Spur:

locationid = 5706bbc7b47a0b25981d3a40 
reviewid = 5706bd65b47a0b25981d3a41 
reviews = { author: 'Simon Holmes', 
    id: 5706bd65b47a0b25981d3a41, 
    rating: 5, 
    timestamp: Tue Jul 16 2013 00:00:00 GMT+0100 (BST), 
    reviewText: 'What a great place. I can\'t say enough good things about it.', 
    createdOn: Fri Apr 08 2016 19:50:15 GMT+0100 (BST) },{ author: 'Jon M', 
    id: 5706bda2b47a0b25981d3a42, 
    rating: 5, 
    timestamp: Tue Sep 09 2014 00:00:00 GMT+0100 (BST), 
    reviewText: 'Meh...', 
    createdOn: Fri Apr 08 2016 19:50:15 GMT+0100 (BST) } 
#0.rating = 5 
#0.id = null 
returned review = null 
GET /api/locations/5706bbc7b47a0b25981d3a40/reviews/5706bd65b47a0b25981d3a41 404 34.468 ms - 32 

Wie Sie das Standortdokument gefunden sehen können, werden die Bewertungen Subdokumente gefunden, und es ist sogar möglich, den Bewertungswert des ersten Elements auszudrucken. Die ID ist jedoch null, obwohl sie in den JSON-Nutzdaten als Wert angezeigt wird.

Gibt es etwas, das ich hier falsch mache?

Wie immer, jede Hilfe geschätzt.

Jon

Antwort

0

So finde ich das Problem mit diesem, und es wurde nicht mit dem Code verwendet, was gut war. Das Problem waren schlechte Daten. Das Überprüfungs-Filialdokument innerhalb des Standortdokuments hatte einen '.id' Pfad und keinen '_id' Pfad.

Mein Fehler, aber klar erklärt, warum ich ein Problem im Code nicht finden konnte.

Verwandte Themen