猫鼬从数组映射中拼接一个值

时间:2020-10-01 16:37:13

标签: javascript node.js mongodb mongoose

我遇到了我希望得到解释的行为。

我有一个用户集合,该集合具有一个uid,并且在其架构中具有一个Array of Array字段。

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");
        }

    });
}

但是,数据库中的用户从未更改,我记录了新的valuesArray,并且确实发生了更改,我记录了user.save返回的Promise,它似乎是没有该值的用户,我发现唯一解决它的方法是在valuesArray的副本上工作:

// const valuesArray = user.words.get(key);
const valuesArray = [...user.words.get(key)];

有人可以解释为什么当我不处理数组副本时为什么没有保存没有拼接值的用户吗?即使看起来确实确实为用户节省了价值。

谢谢。

0 个答案:

没有答案