Удаление объекта массива в Meteor / MongoDB - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь удалить объект внутри массива, я пробовал как тянуть, так и сбрасывать в Meteor.update, но удаляется весь массив, а не только отдельный объект внутри массива.

Код для того, что я пробовал

Cars.update( 
    { _id: id},
    { $unset: { 'models': { '$.id': modelId  }  } })

И

Cars.update( 
{ _id: id},
{ $pull: { 'models': { 'id': modelId  }  } })

В обоих случаях весь атрибут 'models' был удален, а не просто объект из массива

Схема для автомобилей:

models : {
type: [Object],
optional: true
},

'models.$.id': {
type: String,
autoValue: function() {
    return Meteor.uuid()
},
optional: true
}

По сути, коллекции 'Cars' содержат массив 'models', который представляет собой массив объектов (моделей автомобилей). Каждый объект модели автомобиля имеет атрибут id. Я хочу удалить отдельную модель автомобиля из массива моделей, используя атрибут «id», но мои предыдущие попытки удалили весь массив «models» вместо отдельного объекта. Любая помощь будет оценена. Спасибо

До

{
"_id" : "XxbKzS6GHthxwnLFq",
"createdAt" : ISODate("2018-05-04T08:05:59.151Z"),
"updatedAt" : ISODate("2018-05-04T08:36:11.785Z"),
"models" : [ 
    {
        "name" : "Mercedes",
        "id" : "9927cfe1-f5ae-4625-b6eb-87868793a229"
    }, 
    {
        "name" : "BMW",
        "id" : "86f24e9d-dd08-4407-b350-63d9b25dc094"
    }
]
}

После

{
"_id" : "XxbKzS6GHthxwnLFq",
"createdAt" : ISODate("2018-05-04T08:05:59.151Z"),
"updatedAt" : ISODate("2018-05-04T09:38:56.470Z")
}

Родительским объектом является XxbKz ... и он содержит атрибут модели, представляющий собой массив объектов (BMW, Mercedes). Я хочу удалить объект BMW из родительского объекта XxbKz. Я запросил родительский объект, используя его идентификатор (XxbKz ...) и объект BMW, используя его идентификатор (86f2 ...), а также (код в оригинальном сообщении). В результате был удален весь массив моделей (как BMW, так и Mercedes), а не только BMW.

Мой метеоритный звонок был

Meteor.call('deleteCar','XxbKzS6GHthxwnLFq','86f24e9d-dd08-4407-b350- 
    63d9b25dc094') 

deleteCar(carId, modelId) {
check(carId, String)
check(modeld, String)
if (Meteor.isServer) {
    let car = Cars.update( {_id: carId},
      { $pull: { 'models': { 'id': modelId  }  } }
    )   
    console.log(car)
    return car
  }
}

}

Переменными в функции deleteCar являются carId (XxbK) и modelId (86f2), которые являются первым и вторым параметрами из вызова метеора deleteCar. Насколько я понимаю, только BMW от родителя должен был быть удален, но по какой-то причине это не так

1 Ответ

0 голосов
/ 04 мая 2018

Это работает, чтобы удалить Mercedes из вашего примера.

db.cars.update({_id: 'XxbKzS6GHthxwnLFq'}, {$pull: {models: {id: '9927cfe1-f5ae-4625-b6eb-87868793a229'}}})

выглядит так же, как

 Cars.update( 
{ _id: id},
{ $pull: { 'models': { 'id': modelId  }  } })

Я запускал это из оболочки монго, а не из метеорита. Однако я использовал $ pull из Метеора без проблем.

Я никогда не использовал возвратное обновление, оно вполне может возвращать исходный документ перед обновлением. Я бы добавил это вместо этого.

Cars.update( {_id: carId},
      { $pull: { 'models': { 'id': modelId  }  } }
    )       
const car = Cars.findOne(carId)
console.log(car)
return car

Удачи, и дайте мне знать, как вы поживаете.

...