Поддокумент Mongoose — идентификатор не найден

Я провел несколько часов с обильными файлами console.log, пытаясь понять, почему это не работает, и здесь мне не хватает чего-то фундаментального:

Сценарий взят из книги Саймона Холмса «Получение ЗНАЧЕНИЯ» (глава 6). Извиняюсь за копирование всей функции, но я хотел убедиться, что не упустил ничего очевидного.

У меня есть схема, определенная следующим образом:

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

и некоторый код для чтения одного места с конкретным обзором:

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

Используя Google Postman, я делаю запрос к API:

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

Но я получаю ответ

{
  "message": "reviewid not found"
}

Что меня здесь смущает, так это то, что я считаю, что ссылаюсь на правильный идентификатор поддокумента обзора, но не хочу, чтобы JSON показывал это, Javascript его не видит и может объяснить, почему функция мангуста не вернет его:

Это мой след:

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

Как видите, найден документ местоположения, найдены вложенные документы отзывов, и даже можно распечатать значение рейтинга первого элемента. Однако идентификатор имеет значение null, несмотря на то, что он отображается как имеющий значение в полезной нагрузке JSON.

Есть ли что-то, что я делаю неправильно здесь?

Как всегда, любая помощь приветствуется.

Джон


person Jon M    schedule 08.04.2016    source источник


Ответы (1)


Итак, я обнаружил проблему с этим, и она не была связана с кодом, что было хорошо. Проблема была в неверных данных. Вложенный документ отзывов в документе местоположения имел путь «.id», а не путь «_id».

Моя ошибка, но ясно объясняет, почему я не мог найти проблему в коде.

person Jon M    schedule 09.04.2016