首页 > 解决方案 > 如何使用未知对象更新 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,谢谢 :)

标签: javascriptnode.jsmongodbmongoose

解决方案


你可以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);
});

推荐阅读