Mongoose - 如何从数组元素中删除对象[重复]

Posted

技术标签:

【中文标题】Mongoose - 如何从数组元素中删除对象[重复]【英文标题】:Mongoose - How To Remove Object From Array Element [duplicate] 【发布时间】:2018-02-26 00:16:33 【问题描述】:

用户可以添加语言。语言在用户模式中存储为类型为教或学习的数组。我可以简单地使用 push 将一种语言添加到languages.teach[],但是如何删除一种语言?

语言对象示例

let language = 
    "code": FR
    "level": 1
;

UserScema.js

var UserSchema = new Schema(

        email: 
            value: 
                type: String,
                lowercase: true,
                //unique: true,

            ,
            token: String,
            verified: Boolean,
        ,
        password: 
            type: String,
        ,

        phone: 
            countryCode: 
                type: String,
                //required:true,
                unique: true,
            ,
            number: 
                type: String,
                required: true
            ,
            code: String,
            verified: 
                type: Boolean,
                default: false
            ,
        ,

        jwt: String,

        profile: 
            username: String,
            firstname: String,
            lastname: String,
            dob: String,
            level: Number,
            location: String,
            image: String,
            introduction: String,
        ,
        languages: 
            teach: [],
            learn: [],
        
    ,
    
        timestamps: createdAt: 'created_at', updatedAt: 'updated_at'
    );

LanguagesController.js

destroy(req, res) 

    let id       = req.params.id;
    let language = 
        "code": req.body.code,
        "level": req.body.level
    ;
    let type     = req.params.type;

    User.findOne('_id': id, function (err, user) 

        if (err) 
            return res.status(404).json(

                success: true,
                status: 404,
                data: err,
                message: "User does not exist",

            );
        

        if (type === "teach") 

            for (let i = 0; i < user.languages.teach.length; i++)
                if (user.languages.teach[i].code === language.code) 
                    user.languages.teach[i].remove();
                    break;
                

        
        if (type === "learn") 
            //user.languages.learn.push(language);
        

        console.log(user);

        user.save((err, user) => 

            return res.status(200).json(

                success: true,
                status: 201,
                data: user,
                message: "Successfully Deleted Language",

            );
        );

    );


我尝试使用 .remove 但我得到了 user.languages.teach[i].remove 不是一个函数。

【问题讨论】:

尝试user.languages.teach = user.languages.teach.filter( o =&gt; o.code !== language.code),而不是if (type === "teach")中的for循环 那是做什么的,我使用类型,因为我想根据用户输入更改语言数组,如果你想操作类型 == 教学或类型 == 学习,请使用相同的代码.. 对不起,如果我不清楚,但我不是说要删除你的 if 条件,我是说要删除 if (type === "teach") 内的 for 循环,上面给出的 sn-p。 【参考方案1】:

是的 .remove 在阵列上没有任何内容。您可以使用.filter 删除不需要的数组元素。

它会像这样使用:

if (type === "teach") 
    user.languages.teach = user.languages.teach.filter( o => o.code !== language.code)

这将删除符合上述条件的数组中的所有元素。

阅读更多关于Array.prototype.filter的信息。

【讨论】:

现在想知道子文档是否是更好的方法?【参考方案2】:

也许是……

...
if (type === "teach") 
  var index = user.lanauges.teach.findIndex(function(item)
     return item.code === languge.code;
  );

  user.languages.teach.splice(index, 1);

  ....

【讨论】:

嗨,这很有效,而且很容易理解。但我选择了 Raghavgarg 方法,因为它更简单。

以上是关于Mongoose - 如何从数组元素中删除对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 Mongoose/MongoDB 中的数组中删除对象

Mongoose,从数组中删除一个对象并更新其他对象

mongoose - 从 3 级深度数组中添加和删除对象

使用 mongoose 5.12 从数组中删除对象($pull 不起作用)

如何访问在 Mongoose 模式对象数组的另一个数组中定义的数组元素?

无法使用 Mongoose 删除数组中的对象