我需要在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})
}
});
答案 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用于新文档(当过滤器/查询什么都找不到时)。