首页 > 解决方案 > 在 Meteor/MongoDB 中删除数组对象

问题描述

我正在尝试删除数组中的一个对象,我在 Meteor.update 中尝试了拉取和取消设置,但是整个数组被删除,而不仅仅是数组中的单个对象。

我尝试过的代码

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

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

在这两种情况下,整个“模型”属性都被删除,而不仅仅是数组中的一个对象

汽车架构:

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

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

本质上,集合“汽车”包含一个数组“模型”,它是一个对象数组(汽车模型)。每个汽车模型对象都有一个属性 id。我想使用属性“id”从模型数组中删除单个汽车模型,但我上面的尝试删除了整个“模型”数组而不是单个对象。任何帮助,将不胜感激。谢谢

{
"_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)。我想从 XxbKz 父对象中删除 BMW 对象。我使用其 id (XxbKz...) 查询父对象,并使用其 id (86f2...) 查询 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 流星调用的第一个和第二个参数。据我了解,应该只删除父母的宝马,但由于某种原因,情况并非如此

标签: mongodbmeteor

解决方案


这可以从您的示例中删除梅赛德斯。

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

看起来就像

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

我确实从 mongo shell 而不是流星运行了这个。但是我在 Meteor 中使用了 $pull 没问题。

我从未使用过返回更新,它很可能是在更新之前返回原始文档。我会添加这个。

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

祝你好运,让我知道你过得怎么样。


推荐阅读