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

Posted

技术标签:

【中文标题】猫鼬删除文档中的数组元素【英文标题】: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)
);
);

我在 *** 上检查了其他相同的问题,但我无法解决我的问题。

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

【问题讨论】:

您是否尝试将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。 【参考方案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)
    );
);

有几个变化:

    如果这些字段在数据库中的类型为 ObjectId(),则需要将所有值转换为类型 ObjectId()。 同样在$pull中的值可以直接赋值给leads,但不能像对象一样。 您不需要指定safe :true,因为所有猫鼬模式都默认使用该选项。 参考: mongoose-safe-option

【讨论】:

以上是关于猫鼬删除文档中的数组元素的主要内容,如果未能解决你的问题,请参考以下文章

如何更新具有嵌入文档的猫鼬数组中的许多元素

如何使用猫鼬更新子文档数组中的特定元素? [复制]

如何使用猫鼬复制字段数据并在同一文档的另一个字段中使用它?

Mongoose 删除(拉)数组中的文档,不适用于 ObjectID

将文档推送到猫鼬模型数组中的子文档中

将元素推送到猫鼬中的数组