Javascript Mongoose从数组映射中拼接一个值

Javascript Mongoose从数组映射中拼接一个值,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我遇到了一种行为,我希望得到解释 我有一个users集合,它有一个uid,在它的模式中有一个数组字段的映射 userSchema = new mongoose.Schema({ uid: {type: String, unique: true}, words: {type: Map, of: Array} }) 我想从某个键的数组中删除一个值,假设我有一个用户: { uid: "3", words: { "example" -&g

我遇到了一种行为,我希望得到解释

我有一个users集合,它有一个uid,在它的模式中有一个数组字段的映射

userSchema = new mongoose.Schema({
    uid: {type: String, unique: true},
    words: {type: Map, of: Array}
})
我想从某个键的数组中删除一个值,假设我有一个用户:

{
uid: "3", 
words: {
   "example" -> ['one', 'two', 'three'] 
    }
}
我想从示例中删除值'two'

为此,我所做的是:

deleteValue = (id, key, value, callback) => {
 userModel.findOne({ uid: id }, (err, user) => { 
        if (err) {
            console.log(err);
            return;
        }

        if (user.words.has(key)) {
            const valuesArray = user.words.get(key);
            const indexOfValue = valuesArray.indexOf(value);

            if (indexOfValue >= 0) {
                valuesArray.splice(indexOfValue, 1);
                user.words.set(key, valuesArray);
                
                user.save().then(() => callback("Deleted " + value + " From " + key));
            }
        }
        else {
            callback("Key not found");
        }

    });
}

但是数据库中的用户从未更改,我记录了新的ValuesRay,它确实更改了,我记录了user.save返回的承诺,它似乎是没有该值的用户,我发现修复它的唯一方法是处理ValuesRay的副本:

// const valuesArray = user.words.get(key);
const valuesArray = [...user.words.get(key)];
有人能解释为什么当我没有处理阵列的副本时,它没有保存没有拼接值的用户吗?即使它看起来确实保存了一个没有值的用户


谢谢。

尝试
过滤器
并保存修改后的数组。