也许我的措词不正确,但希望我能对此有所帮助。我一直在和猫鼬模式玩,男孩一直在处理这个问题。
我想用特定的ID更新集合中的文档,但是我已经完成了所有工作。我遇到了一个问题,因为我从来没有为其他人提供过值,所以我不想更新它,使它们全部为Null或在打开omitUndefined的情况下将其删除。
router.put('/api/playerinfo/:player_steamID/main_server', passport.authenticate('basic', {session: false}),
function(req, res){
const params = {
main_server: {
game_stats:{
kills: req.body.main_server.game_stats.kills,
deaths: req.body.main_server.game_stats.deaths,
}
}
};
PlayerInfo.findOneAndUpdate({player_steamID: req.body.player_steamID }, {$set: params}, { upsert: true, new: true }).then(playerinfo =>{
res.json(playerinfo)
});
});
例如: 当前存储的信息
{
"name": "Jimbo",
"steamID": "123456",
"main_server": {
"game_stats": {
"kills": 3,
"deaths":0
}
}
}
然后,如果我们使用上面的代码修改字段。.但是,如果我们不为该字段提供死亡值,则如果忽略true,它将使底部无效或将其完全删除。
使用以下内容发送邮递员更新:
{
"name": "Jimbo",
"steamID": "123456",
"main_server": {
"game_stats": {
"kills": 34
}
}
}
更新的信息
{
"name": "Jimbo",
"steamID": "123456",
"main_server": {
"game_stats": {
"kills": 34,
"deaths": null
}
}
}
我想知道的是在不“更改”最后一个值的情况下修改多个字段的最佳方法。如果缺少字段。有可能吗?
IE:如果我只提供杀死值,而将json更新中的死亡信息留空,它将保留死亡时的旧值。
谢谢。
-固定 在$ set中创建了一个对象,然后更新旧值而不替换它,您需要将它们用引号引起来。 'main_server.game_stats.kills':req.body ..... kills等。
答案 0 :(得分:0)
使用$set
仅更新某些字段。
PlayerInfo.findOneAndUpdate({steamID: req.body.steamID },{ $set: {'yourcoll.$.someField': 'Value'} }, { upsert: true, new: true }).then(playerinfo =>{
res.json(playerinfo)
});
文档:
https://docs.mongodb.com/manual/reference/operator/update/set/
答案 1 :(得分:0)
已修复。在$ set中创建了一个对象,然后更新旧值而不替换它,您需要将它们用引号引起来。 'main_server.game_stats.kills':req.body ..... kills等。
我还在对象中进行了for循环,并分配了道具以处理多个值(如果从json传递过来的话)。
答案 2 :(得分:0)
您可以尝试只放置模型的一部分,其中包含要更新的特定字段
_userModelRepository.updateUser( { email: req.user.email }, { specificField: specificValue});
这是架构实现
updateUser = function(query, params){
return _userModelRepository.findOneAndUpdate(query, params, function(err, result) {
if (err) {
throw err;
}
});
}