【问题标题】:Mongoose delete array element in document猫鼬删除文档中的数组元素
【发布时间】:2020-06-10 09:35:54
【问题描述】:

您好,我被困在这一点上,我有一个团队模型,如下所示。

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 上检查了其他相同的问题,但我无法解决我的问题。

实现这一目标的正确要求是什么?

【问题讨论】:

  • 您是否尝试将id_to_delete 转换为ObjectId
  • 不,我该怎么做?
  • mongoose.Types.ObjectId(id_to_delete)
  • 我检查过但没有变化。回复是一样的
  • @HammadAli : 不确定n:1 怎么样,但你可以试试这个Team.update({ _id: mongoose.Types.ObjectId(_id) }, { "$pull": { "leads": mongoose.Types.ObjectId(id_to_delete) } },你不必使用安全选项,因为它默认为true。

标签: javascript arrays node.js mongodb mongoose


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2018-05-28
    • 2019-06-06
    • 1970-01-01
    • 2020-12-18
    • 2019-08-05
    • 2021-06-14
    • 2020-12-31
    • 2022-08-02
    相关资源
    最近更新 更多