猫鼬删除文档中的数组元素

时间:2020-02-26 13:35:09

标签: javascript arrays node.js mongodb mongoose

嗨,我被困在这一点上,下面有一个团队模型。

var teamSchema = new mongoose.Schema({
name:{
    type : String
},
members :[
    {
        type: mongoose.Schema.ObjectId,
        ref: 'Users'
    }
],
leads:[
    {
        type: mongoose.Schema.ObjectId,
        ref: 'Users'
    }
],
admin_rights :[
    {
        type: mongoose.Schema.ObjectId,
        ref: 'Users'
    }
],
view_rights :[
    {
        type: mongoose.Schema.ObjectId,
        ref: 'Users'
    }
]
});

在此模型中,我引用了User Schema。 我想删除leads数组中的一个元素。我尝试了很多次,但显示如下。

{
"n": 1,
"nModified": 0,
"opTime": {
    "ts": "6797745245908893697",
    "t": 4
},
"electionId": "7fffffff0000000000000004",
"ok": 1,
"operationTime": "6797745245908893697",
"$clusterTime": {
    "clusterTime": "6797745245908893697",
    "signature": {
        "hash": "Sdl1QzsqCcO7SKS95+N1Gx7rkJY=",
        "keyId": "6762348659485966337"
    }
}
}

这是删除数组元素但不起作用的代码。

router.get('/deletelead', (req, res) => {
var _id = req.query.team_id;
var id_to_delete = req.query.id;


Team.update({ _id: _id }, { "$pull": { "leads": { id_to_delete }  } }, { safe: true }, function(err, obj) {
    if(!err){
        res.json(obj)
    }
    else
    res.json(err)
});
});

我检查了关于stackoverflow的其他相同问题,但无法解决我的问题。

达到此目的的正确要求是什么?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下代码:

const mongoose = require('mongoose');

router.get('/deletelead', (req, res) => {
    var _id = req.query.team_id;
    var id_to_delete = req.query.id;

    Team.update({ _id: mongoose.Types.ObjectId(_id) }, { "$pull": { "leads": mongoose.Types.ObjectId(id_to_delete) } }, function (err, obj) {
        if (!err) {
            res.json(obj)
        }
        else
            res.json(err)
    });
});

有几处更改:

  1. 如果这些字段在数据库中为ObjectId()类型,则需要将所有值转换为ObjectId()类型。
  2. $pull中的值也可以直接分配给leads,但不像对象。
  3. 您无需指定safe :true,因为所有猫鼬模式默认为该选项。 参考: mongoose-safe-option