javascript - 如何使用未知对象更新 MongoDB
问题描述
我正在使用以下猫鼬模型:
const userSchema = new mongoose.Schema({
userID: { type: String, require: true, unique: true },
username: { type: String },
serverID: { type: String, require: true },
roles: [String],
gameProfile: {
accountName: { type: String, default: '?' },
accountLevel: { type: Number, min: 1, max: 65, default: 1 },
accountClass: { type: String, default: '?' },
favoriteWeapon: { type: String, default: '?' },
},
}, { timestamps: true });
const User = mongoose.model('User', userSchema);
我正在尝试创建一个“gameProfile”编辑命令,以便用户可以更新他们的accountName、accountClass 等。目前,当用户运行我的编辑命令时,我会收到一个他们想要编辑的数据对象(一次完成),它可能看起来像:
{ accountName: 'bob', accountLevel: 55 }
或{ accountName: 'billy', favoriteWeapon: 'axe', accountLevel: 100, accountClass: 'TANK'}
gameProfile 对象中这些字段的任何排列。
所以我需要做的基本上是在一次更新中将该对象合并到现有的用户文档中。不更新未编辑的值。
我天真地尝试过的是:
// const data = { accountLevel: 50, accountClass: 'DPS', favoriteWeapon: 'sword' }
UserModel.updateOne({ userID: interaction.user.id }, { data }, function(err, res) {
if (err) {
console.error(err);
} else {
console.log('RESULT: ', res);
}
});
这不会出错,但也不会更新数据库。如果有人可以帮助我,将不胜感激。我只是在学习 MongoDB/NoSQL,谢谢 :)
解决方案
你可以findByIdAndUpdate
这样使用。根据评论,我正在更新它。您知道数据中的内容,获取所有字段,然后创建查询并将其传递给 set。
const data = { accountLevel: 50, accountClass: 'DPS' },
dataToUpdate = {};
Object.keys(data).forEach(el => {
dataToUpdate[`gameProfile.${el}`] = data[el];
})
UserModel.findByIdAndUpdate(entityId, {$set: dataToUpdate}, function(err, doc) {
if (err) console.error(err);
console.log(doc);
});
推荐阅读
- c# - 难以将 JSON 数据绑定到 SyncFusion LineChart
- java - 如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?
- youtube-api - 有效使用 Youtube Data v3 API 密钥
- mysql - AUTO_INCREMENT 字段中键“PRIMARY”的重复条目
- javascript - 无法使用 jquery 更改 css 样式属性
- google-apps-script - Sheet.getRange 在不使用 A1 表示法时抛出签名不匹配异常
- javascript - 按元素位置显示大 div 的一小部分
- kotlin - 如何格式化和绑定多个 SimpleObjectProperties
给一个标签? - git - 从本地推送到远程时的空文件夹
- laravel - Data from geoJSON API call in Larvel 5.8