【问题标题】:accessing and updating mongo object with keys使用键访问和更新 mongo 对象
【发布时间】:2017-09-18 10:20:00
【问题描述】:

我有一个如下的 mongo 架构

var schema = mongoose.Schema({
user: {type:ObjectId, ref: 'User'},
preferences: mongoose.Schema.Types.Mixed
});

module.exports = mongoose.model('UserPreference', schema);

我正在用数据拨打电话

{
"newQuestionPrompt": false,
"oldQuestion": false
}

这些属性中的每一个都需要设置到首选项字段中,例如

"_id" : ObjectId("58f9d06cf998d9baccf8024f"),
"user" : ObjectId("58eda68601dc391e27f3e2c4"),
"preferences":{
 "newQuestionPrompt": false,
 "oldQuestion": false
 }

但是,当再次为同一个用户进行相同的帖子调用时,调用中可能存在完全不同的属性,或者具有不同值的相同属性,例如

{
  "newQuestionPrompt": true,
  "randomQuestion": false
}

在这种情况下,我需要更新已经存在的属性的值并添加不存在的属性,所以早期的对象应该变成

"_id" : ObjectId("58f9d06cf998d9baccf8024f"),
"user" : ObjectId("58eda68601dc391e27f3e2c4"),
"preferences":{
"newQuestionPrompt": true,
"oldQuestion": false,
"randomQuestion": false
}

我不能使用 $set preferences:req.body ,因为它会覆盖整个内容。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 设置 Object.assign(oldobjfromdatabase,newobjfromuser)
  • 试试:"_id" : ObjectId("58f9d06cf998d9baccf8024f"), "user" : ObjectId("58eda68601dc391e27f3e2c4"), "$set":{ "preferences.newQuestionPrompt": false }
  • 如果您使用preferences.newQuestionPrompt,则只会设置newQuestionPrompt 属性,而不会删除其他属性。换句话说preferences.newQuestionPrompt 只会更新newQuestionPrompt 而不是整个preferences 对象。

标签: javascript node.js mongodb object mongoose


【解决方案1】:

尝试将传入呼叫对象转换为具有 dot notation 键的对象,以便您可以使用 $set 更新,即转换

{
    'newQuestionPrompt': true,
    'randomQuestion': false
}

{
    'preference.newQuestionPrompt': true,
    'preference.randomQuestion': false
}

转换后,您可以在更新中将其用作:

UserPreference.findByIdAndUpdate(req.params.id, 
    {
        '$set': {
            'preference.newQuestionPrompt': true,
            'preference.randomQuestion': false
        }
    }, 
    { 'new': true },
    (err, pref) => {
        if (err) throw err;
        console.log(pref);
    }
)

对于对象的转换,可以尝试以下方法:

let update = { '$set': {} };
let options = { 'new': true };
let cb = (err, pref) => {
    if (err) throw err;
    console.log(pref);
};

Object.keys(req.body).forEach((key) => {
    update['$set'][`preference.${key}`] = req.body[key];  
});

UserPreference.findByIdAndUpdate(req.params.id, update, options, cb);

【讨论】:

  • 像魅力一样工作。谢谢。
猜你喜欢
  • 2015-05-05
  • 2019-10-06
  • 2016-06-02
相关资源
最近更新 更多