猫鼬FindOneandUpdate-仅更新特定字段,其他字段不予处理

时间:2019-09-22 22:00:57

标签: node.js mongoose

也许我的措词不正确,但希望我能对此有所帮助。我一直在和猫鼬模式玩,男孩一直在处理这个问题。

我想用特定的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等。

3 个答案:

答案 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;
                }
            });
    }