猫鼬:如何在Object中插入新字段?

时间:2018-08-09 08:09:23

标签: mongodb mongoose

我需要在Object中添加一个新字段,但是旧字段将被删除并插入一个新字段。 upsert:true无效。

await Model.findOne({userID:message.author.id}, async function(err, user) {
    if (!user.servers_xp[message.guild.id]) {
        await Model.updateOne({userID:message.author.id}, { $set: {
            servers_xp: {[message.guild.id]: {level: 1, curentxp: 0}}
        } }, {upsert:true})
    }
});

1 个答案:

答案 0 :(得分:0)

在更新操作中的$ set语句上,您使用新对象{[message.guild.id]: {level: 1, curentxp: 0}}覆盖了整个server_xp字段,因此您的server_xp字段将完全具有此对象。

相反,为了将新字段添加到已存在的对象(server_xp)中,应使用点符号,这样将更新对象且不会覆盖该对象。

像这样:

await Model.findOne({userID: message.author.id}, async function (err, user) {
    if (!user.servers_xp[message.guild.id]) {
        let updateObj = {};
        updateObj[`server_xp.${message.guild.id}`] = {level: 1, curentxp: 0};
        await Model.updateOne({userID: message.author.id}, {
                $set: updateObj
            },
    }
});

我认为您不需要在这里进行更新。 upsert用于新文档(当过滤器/查询什么都找不到时)。