如何在mongoose中从数组中删除元素

时间:2017-01-07 11:37:24

标签: express mongoose

我有以下架构:

// userSchema
{
  _id: Schema.ObjectId,
  email: { type: String, unique: true },
  password: String,
  boxes: [boxSchema]
}
// boxSchema
{
  _id: Schema.ObjectId,
  boxId: { type: String, unique: true },
  boxName: String
}

我有这样的数据:

{
 _id: random,
 email: em@i.l,
 password: hash,
 boxes: [{ "boxId" : "box1", "boxName" : "Box 1"}, 
  { "boxId" : "box2","boxName" : "Box 2"},
  { "boxId" : "box3","boxName" : "Box 3"}]
}

我试图用boxId:box1从box数组中删除一个元素,我试过的代码是这样的:

User.findOne({
        _id: req.body.id
    })
    .then(function (user) {
        if (user) {
            for (i in user.boxes)
                if (user.boxes[i].boxId === 'box1')
                   user.boxes[i].remove();
            res.json('removed');
        }
    })
    .catch(function (err) {
        ....
    });

但是会发生什么呢,它会删除所有正在居住的盒子,而不是boxId:box1

2 个答案:

答案 0 :(得分:2)

使用filter

怎么样?
User.findOne({
    _id: req.body.id
})
.then(function (user) {
    if (user) {

        user.boxes = user.boxes.filter(function(box){
            return box.boxId !== 'box1'
        })

        res.json('removed');
     }
 })
.catch(function (err) {
    ....
});

答案 1 :(得分:0)

有很多方法可以从数组中删除元素,如下所示:

1)Delete():使用此函数将删除元素但不会更改数组大小并在删除元素后保留空白对象。

2)splice():它类似于delete(),但在删除元素后删除数组中的空白位置。

3)filter():它将函数作为参数并有效地删除元素。