gpt4 book ai didi

javascript - Mongoose 更新嵌套值

转载 作者:可可西里 更新时间:2023-11-01 10:02:49 51 4
gpt4 key购买 nike

我的 mogoose 架构中有一些嵌套属性,如下所示:

const userSchemaValues = {
username: {
type: String,
required: [true, 'Username required'],
trim: true,
unique: true,
lowercase: true
},
password: {
type: String,
required: [true, 'Password required'],
trim: true,
minlength: 8
},

...

prop: {
prop_1: String,
prop_2: String
}
};

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));

User.update({_id: req.params.id}, {$set: valuesToUpdate})
.then((data) => {
return res.json({message: data});
})
.catch(err => {
log.error(err);
return next({message: 'Error updating User.'});
});

但是当我对 prop_1 和 _2 设置了这样一个对象的用户执行 User.update({_id: req.params.id}, {$set: valuesToUpdate}) 时 ({"prop":{"prop_1": "somevalue"}), 它不是在寻找 prop 中的内容,它只是覆盖它。我怎样才能避免这种情况?

最佳答案

您的查找需要包含要更新的属性。更新语句也需要 Positional Update Operator将其更改为(超出我的头脑):

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));

User.update({$and : [{_id: req.params.id}, {prop.prop1 : "%oldvalue%"}]}, {$set: { "prop.$.prop1" : "%newvalue""}})
.then((data) => {
return res.json({message: data});
})
.catch(err => {
log.error(err);
return next({message: 'Error updating User.'});
});

请注意,位置更新只会更新第一次出现的位置!

更新:重读你的问题后,我发现 Prop 不是数组......非常抱歉。幸运的是,这使它变得容易得多:)

您不需要该字段出现在查找中对于集合:{ $set : { "prop.prop1": "newvalue"}也不需要位置更新,因为它不是数组。

这使得以下内容:

valuesToUpdate.prop = _.pick(req.body, 'prop_1', 'prop_2');
log.debug(JSON.stringify(valuesToUpdate));

User.update({_id: req.params.id}, {$set: { "prop.prop1" : "%newvalue%"}})
.then((data) => {
return res.json({message: data});
})
.catch(err => {
log.error(err);
return next({message: 'Error updating User.'});
});

更新 2:有关更新语句的更多信息。

由于评论的缘故,我将阐明更新命令。当您想更新文档中的字段时,您可以使用 $set命令。这会更新一个或多个字段。当你想更新多个字段时,你可以使用如下命令来完成:

$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : "newvalueforprop2"} }

但是当您使用上面的命令并指定一个字段时,它会生成如下命令:

$set : { "prop.prop1" : "newvalueforprop1", "prop.prop2" : null} }

这就是关于如何创建更新命令的全部内容。当您不知道它是 1 个还是 2 个属性时,您需要更新代码以便它动态生成命令。但您可以做的另一件事是让 Mongoose 处理更新。

使用类似的东西:

User.findById(req.params.id, function (err, user) {
if (err) {
handleError(err)
}
else {
//you should to some checking if the supplied value is present (!= undefined) and if it differs from the currently stored one
user.prop.prop1 = "your value";
user.prop.prop1 = "2nd value"

user.save(function (err) {
if (err) {
handleError(err)
}
else {
res.json(user);
}
});
}
});

希望现在一切都清楚了。

关于javascript - Mongoose 更新嵌套值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39408863/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com