2016-02-28 2 views
0

Я просматриваю книгу, и код не работает. Все в Google и здесь указано, что код прав! Она не работаетКак выбрать субдокум манго по id с помощью мангуста?

Loc 
     .findById(req.params.locationid) 
     .select('name reviews') 
     .exec(
     function(err, location) { 
      if (location.reviews && location.reviews.length > 0) { 
      // this is the problem: 
      review = location.reviews.id(req.params.reviewid); 
      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); 
      } 
      } 
     } 
    ); 

id не является функцией, поэтому id() возвращает ничего.

Я пробовал жестко кодировать идентификационный номер, устал много вещей, которые я нашел в Интернете, но суть в том, что location.reviews.id - это просто значение. Я также сделал Loc.findById(req.params.locationid).reviews ...: where, findById, ничего! Я тоже много времени искал _id и многое, что пошло с этим

Я мог бы просмотреть обзоры и остановиться, если матч reviews.id, но я хочу знать, что пытался сделать автор.

Я так понимаю, что location является Java-объект, это естественно, чтобы не быть в состоянии использовать id как функция

Это схема

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 locationSchema = new mongoose.Schema({ 
    name: {type: String, required: true}, 
    address: String, 
    rating: {type: Number, "default": 0, min: 0, max: 5}, 
    facilities: [String], 
    coords: {type: [Number], index: '2dsphere'}, 
    openingTimes: [openingTimeSchema], //nesting a schema 
    reviews: [reviewSchema] 
}); 

Весь модуль кода (хотя я бы поделился им, я не выбрал правильный кусок):

module.exports.reviewsReadOne = function(req, res) { 
    console.log("Getting single review"); 
    if (req.params && req.params.locationid && req.params.reviewid) { 
    Loc 
     .findById(req.params.locationid) 
     .select('name reviews') 
     .exec(
     function(err, location) { 
      if (location.reviews && location.reviews.length > 0) { 
      review = location.reviews.id(req.params.reviewid); 
      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": "Not found, locationid and reviewid are both required" 
    }); 
    } 
}; 

Чем вы поможете?

+0

Пожалуйста, добавьте схему 'Loc' в свой вопрос? В этом документе [doc] (http://mongoosejs.com/docs/subdocs.html) у DocumentArrays есть специальный метод 'id' для поиска документа по его' _id' – zangw

+0

@zangw Я просто добавил схему. Я прошел через этот документ так много времени и не могу заставить его работать – relidon

+0

Является ли 'req.params.reviewid' действительным' ObjectId'? какова ценность 'req.params.reviewid'? – zangw

ответ

1

Пер нашей дискуссии, мы нашли причину по

db.locations.update({ name: 'Starcups' }, 
        { $push: { 
         reviews: { 
          author: 'Simon Holmes', 
          id: ObjectId(), // issue is here 
          rating: 5, ... } } }) 

id: ObjectId() создаст id поле в поддокументе и без _id поля в reviews поддокументе.

id() метод используется для документооборота имеют специальный метод поиска документов по _id. Поскольку поле _id отсутствует в массиве документов reviews, оно не работает.

Пожалуйста, удалите id: ObjectId() с вашего кода.

+0

Я, наконец, добавил новые поддокументы, и результат был идеальным. Я потратил несколько часов на эту проблему. И что смешно (теперь все кончено), книга имеет его как 'id: ObjectId()' и не делает id() для getter для _id. благодаря – relidon

1

Я признаю это в качестве примера на странице 151 получения MEAN Саймоном Холмсом. Проблема в том, что в книге крошечная ошибка. Имя «id» в вышеуказанной команде $ push должно быть «_id». Внесите это изменение, и все будет работать. Вышеупомянутое предположение о том, что вы просто удаляете id: ObjectId() неверно.

Смежные вопросы