2016-11-01 8 views
0

Я разрешил повторяющуюся ошибку, и этот маршрут добавит объект эпизода в массив эпизодов, но я не решил, как проверить запрос не только для документа ObjectId, но и для также внутри массива эпизодов, и убедитесь, что нет совпадений в сезоне и номере episode_number, которые совпадают с тем, который я добавляю в req.body.Обновление mongoose, которое будет проверять для тех же полей перед добавлением

Это мой маршрут

router.put('/api/shows/:id/episodes/add', function(req, res){ 
    var setObject = req.body; 
    setObject.episode_id = new mongoose.Types.ObjectId; 
    Show.update({'_id':req.params.id}, {$push:{'episodes':setObject}}, function(err, doc){ 
     if(err){console.log(err)} 
     else{res.json(doc)}; 
    }) 
}) 

Это мой документ базы данных

{ 
    "_id" : ObjectId("58190ebffa6503f8d9e114cc"), 
    "title" : "Designated Survivor", 
    "poster" : "https://images-na.ssl-images-amazon.com/images/M/[email protected]_V1_.jpg", 
    "rated" : "TV-14", 
    "program_time" : 60, 
    "network" : "ABC", 
    "airs_on" : [ 
      "Wednesday" 
    ], 
    "streams_on" : [ 
      "123Movies", 
      "Hulu Plus" 
    ], 
    "genre" : [ 
      "Drama" 
    ], 
    "users" : [ ], 
    "episodes" : [ 
      { 
        "_id":ObjectId('#############'), 
        "season_number" : 1, 
        "episode_number" : 1, 
        "title" : "Pilot", 
        "watched" : true 
      }, 
      { 
        "season_number" : 1, 
        "episode_number" : 2, 
        "title" : "The First Day", 
        "watched" : true 
      }, 
      { 
        "season_number" : 1, 
        "episode_number" : 3, 
        "title" : "The Confession", 
        "watched" : true 
      }, 
      { 
        "season_number" : 1, 
        "episode_number" : 4, 
        "title" : "The Enemy", 
        "watched" : true 
      }, 
      { 
        "season_number" : 1, 
        "episode_number" : 5, 
        "title" : "The Mission", 
        "watched" : true 
      }, 
      { 
        "season_number" : 1, 
        "episode_number" : 6, 
        "title" : "The Interrogation", 
        "watched" : false 
      } 
    ] 
} 

Это вызов, я использую в почтальона

https://temp-crud-app-rawlejuglal.c9users.io/tv/api/shows/58190ebffa6503f8d9e114cc/episodes/add 
-->body 
    title 'The Traitor' 
    watched false 
    season_number 1 
    episode_number 7 

ответ

0

Я думаю, что вам нужно преобразовать сначала _id to ObjectId. См этого Convert string to ObjectID in MongoDB

+0

Я попытался { '_id': новый Mongoid (req.params.id)} и ниже вариант, ObjectId = require ('mongodb') ObjectID; ObjectId ("34234234234234234234") Но у меня все еще такая же ошибка –

+0

router.put ('/ api/shows /: id/episodes/add', function (req, res) { var query = { $ and: [{'_ id': req.params.id}, {'episodes': {$ elemMatch: {'season_number': req.body.season_number, 'episode_number': {$ gt: req .body.episode_number-1, $ lt: req.body.episode_number + 1}} }}]} TV.find (запрос, {}, {}, функция (ERR, результаты) { , если (ERR) {console.log (ERR)} еще {res.json (результаты) }; }) }) –

+0

Скажите, пожалуйста, что вы получаете в console.log (результат) –

0

Проблема, кажется, ваш запрос, как он пытается получить документ, я бы предложил назвать findOne перед обновлением и посмотреть, если вы действительно получаете предполагаемый документ, конечно, вы не должны получите запрос.

Я также не уверен, что логика 'episode_number':{$gt:req.body.episode_number-1, $lt:req.body.episode_number+1}

почему не может это быть 'episode_number': req.body.episode_number

+0

Спасибо за комментарий. Я обновил вопрос, где я сейчас. Я могу получить документ, который хотел, но вы правы, я не получал его раньше.Он добавляет объект эпизода в массив эпизодов, но я не могу понять, как проверить и убедиться, что я не добавляю объект эпизода с номером season_number и episode_number, который уже существует. Код $ gt пытался проверить, что номер эпизода, который я предоставил в req.body, был следующим доступным номером эпизода, но теперь я думаю, что это была не хорошая логика. Я думаю, мне нужно использовать $ elemMatch и $ ne, но все, что я пробовал, ломает маршрут. –

+0

Я думаю, что вы хотите добавить объект в список, когда такого объекта нет, но есть документ. Теперь посмотрите на другую сторону, что, если сам документ отсутствует и что, если документ есть, и объект также присутствует с тем же номером сезона и номером эпизода. Я сомневаюсь, что тот же запрос на обновление будет обрабатывать все сценарии. Что касается запроса, вы правы, вы должны использовать $ elemMatch внутри $ not. –

+0

Существуют различные способы, и, вероятно, ни один из них не ошибается, например, вы можете сохранить одну внутреннюю переменную, значение которой будет конкатенацией номера сезона и номера эпизода, это устранит использование $ elemMatch. И тогда есть старый школьный путь, возьмите документ, выполните всю логику в своем приложении и сохраните ее. Я знаю, что это немного скучно, но когда-нибудь все будет проще. –