2016-11-07 3 views
0

У меня возник вопрос при попытке удалить под-документ из MongoDB.lodash удаляет все объекты из массива. Не соответствует моей спецификации

Вот моя структура данных:

"event" : { 
    "_id": "581fec8011acfb28f6bb0b96", 
    "participants": [ 
    { 
    "_id": "582041475aa37c0e27fde28b", 
    "regDate": "2016-11-07T08:54:31.155Z", 
    "group": "board member", 
    "lastName": "1", 
    "firstName": "test", 
    "eventCode": "07e05d" 
    }, 
    { 
    "_id": "5820414b5aa37c0e27fde28c", 
    "regDate": "2016-11-07T08:54:35.462Z", 
    "group": "participant", 
    "lastName": "2", 
    "firstName": "test", 
    "eventCode": "f1685a" 
    }, 
    { 
    "_id": "5820414e5aa37c0e27fde28d", 
    "regDate": "2016-11-07T08:54:38.441Z", 
    "group": "participant", 
    "lastName": "3", 
    "firstName": "test", 
    "eventCode": "a71ec5" 
    } 
] 
} 

Я пытался использовать lodash для удаления одного участника, но lodash удалить все мои участников. Можете ли вы помочь мне решить эту проблему?

Я обновил весь код на стороне сервера, где имеет проблему

var alias = req.params.alias; 
var pid = req.params.pid; 

    var findAndRemoveParticipant = new Promise ((resolve, reject) => { 
     Event.findOne({ 
      "alias":alias 
     },'participants') 
     .exec((err, event) => { 
      if(err) reject(err) 
      else { 
       _.remove(event.participants, {_id: pid}); 
       event.save((err, saved) => { 
        err ? reject(err) : resolve(saved) 
       }) 
      }  
     }) 
    }); 

    findAndRemoveParticipant 
     .then(saved => { 
      res.status(200).json('Participant removed successfully'); 
     }) 
     .catch(err => res.status(400).json(err)); 

В стороне клиента я использую тот же код, и она работает

$http.delete(_deleteParApi) 
     .success(msg => { 
      $scope.parRemoved = msg; 
      _.remove($scope.participants,{_id: pid}) 
     }) 
     .catch(err => { 
      console.log(err); 
     }) 

ответ

0

использование Монго $ тянуть:

Event.update(
    {"alias":alias}, 
    { $pull: { 'participants': { _id: pid } } } 
); 
+0

Спасибо за это, я решил свою проблему. Но я до сих пор не понимаю, почему lodash не работает в моей ситуации. Это так странно. –

0

ли это

MODEL.find(YOUR QUERY).lean().exec(function(err, data){ 
// MODIFY DATA NOW AND SAVE IT 
}) 

DUPLICATE QUESTION


ИЛИ

Mongoose Модель наследует из документов, которые имеют метод с ToObject(). Я считаю, что то, что вы ищете, должно быть результатом doc.toObject().

take a look

var pid = req.params.pid;/ 
event.toObject() 
event.participants = _.remove(event.participants,{_id: pid}) 
console.log(event.participants); 
// [] 
event.save((err,saved) => { 
    err ? reject(err) : resolve(saved) 
} 
+0

, что не работает в моей ситуации :( –

0

Согласно lodash document, он удаляет совпавшие элементы из массива и возвращает массив удаленных элементов, так что вам не нужно назначить его обратно event.participants, но если вы делаете, вам нужно проверить «не равно», чтобы получить возвращенный массив, который вы хотите. Вот пересмотренный код:

var pid = req.params.pid; 
event.participants = _.remove(event.participants,function(o) { 
    return o._id !== pid; 
}); 
console.log(event.participants); 

Вот выход, если PID = '582041475aa37c0e27fde28b':

[{ 
    _id: '5820414b5aa37c0e27fde28c', 
    regDate: '2016-11-07T08:54:35.462Z', 
    group: 'participant', 
    lastName: '2', 
    firstName: 'test', 
    eventCode: 'f1685a' 
}, { 
    _id: '5820414e5aa37c0e27fde28d', 
    regDate: '2016-11-07T08:54:38.441Z', 
    group: 'participant', 
    lastName: '3', 
    firstName: 'test', 
    eventCode: 'a71ec5' 
}]