2015-06-29 1 views
2

У меня есть база данных, которая включает в себя проекты, и каждый проект имеет множество ссылок. Мой express.js код при добавлении ссылки как таковой:Как узнать, добавляет ли Mongoose addToSet что-то?

router.get('/links/add', function(req, res){ 
    Project.findOneAndUpdate(
     {_id: req.query.pid}, 
     {$addToSet: {links: {url: req.query.url , title: req.query.title} }}, 
     {safe: true, upsert: true, new:true}, 
     function(err, project) { 
      if(err) { 
       //do stuff 
      } else { 
       //Something was added to set! 
      } 
     } 
    ); 
}); 

Он отлично работает и не добавляет дубликатов, но мне нужно знать, когда что-то на самом деле обновляется. Теперь вы можете видеть, что я включил параметр new:true, который возвращает новый документ, поэтому я мог бы просто удалить его и посмотреть, существует ли ссылка в старой версии, но есть ли способ сделать это с включенным флагом?

Это похоже на базовую функцию, но я не мог найти что-либо в документации.

+0

Вы хотите посмотреть новую обновленную информацию? Или вы пытаетесь определить, обновлено ли что-то? Не могли бы вы просто запустить событие в инструкции else? – ChadF

+0

Я хочу посмотреть, что-то обновлено. Я уже вижу «обновленный» документ (прочитайте: состояние документа после запроса) с флагом «new: true», я просто не вижу способа выяснить, действительно ли что-то было добавлено. Код вводится в блок else, даже если ничего не было добавлено, это не считается ошибкой mongoose. – Bimp

+0

Хммм, я думаю, что лучший способ - сделать поиск до поиска и обновления. Затем сравните значение find со значением, которое вы собираетесь обновить. – ChadF

ответ

0

Поскольку вы добавляете в набор, мы найдем его, а затем проверим, находится ли наше значение обновления в наборе. Если это так, мы можем закончить эту функцию, иначе мы можем обновить ее, сохранив информацию о том, что было обновлено. (Это суть, может быть ошибка или два, так как я не могу ее сам проверить).

router.get('/links/add', function(req, res){ 
    var updating = false; 

    Project.find({_id: req.query.pid}, function(err, project) { 
     if(err) { 
     // handle error 
     } else { 
     // Check if found project contains what we mean to update. 
     // If it does already (nothing is changing) leave updating as false 
     // and we exit. 

     // Otherwise keep reference to what is being updated, set updating to 
     // true, and after we finish updating you have reference to what changed 
     } 
    } 
    if(updating) { 
     Project.findOneAndUpdate(
      {_id: req.query.pid}, 
      {$addToSet: {links: {url: req.query.url , title: req.query.title} }}, 
      {safe: true, upsert: true, new:true}, 
      function(err, project) { 
       if(err) { 
        //do stuff 
       } else { 
        //Something was added to set! 
       } 
      } 
    ); 
    } 
}); 
+0

Поскольку я уже знаю способ сделать это с 1 запросом (отключив флаг 'new'), я хотел сосредоточиться на поиске способа заставить mongoose вернуть мне что-то полезное через само обновление, вместо того, чтобы делать 2 запроса. Тем не менее я соглашусь на это, если такое решение не появится. – Bimp

+0

О, я понимаю, о чем вы говорите. Однако я не знаю, как это сделать. – ChadF