3

所以我的数据库中有这个文档,如下所示

{
  "_id": {
    "$oid": "59a8668f900bea0528b63fdc"
  },
  "userId": "KingSlizzard",
  "credits": 15,
  "settings": {
    "music": 1,
    "sfx": 0
  }
}

我有这种方法可以只更新文档中的特定字段

function setPlayerDataField(targetUserId, updateObject) {
    playerDataCollection.update({
            "userId": targetUserId //Looks for a doc with the userId of the player
        }, { $set: updateObject }, //Uses the $set Mongo modifier to set value at a path
        false, //Create the document if it does not exist (upsert)
        true //This query will only affect a single object (multi)
    );
}

如果我执行类似的命令,它可以正常工作

setPlayerDataField("KingSlizzard",{"credits": 20});

它会导致这样的文件

{
  "_id": {
    "$oid": "59a8668f900bea0528b63fdc"
  },
  "userId": "KingSlizzard",
  "credits": 20,
  "settings": {
    "music": 1,
    "sfx": 0
  }
}

积分的价值现在是 20 耶!这是所希望的。

但是,如果我执行此命令...

setPlayerDataField("KingSlizzard",{"settings": {"music":0}});

它会导致这样的文件

{
      "_id": {
        "$oid": "59a8668f900bea0528b63fdc"
      },
      "userId": "KingSlizzard",
      "credits": 20,
      "settings": {
        "music": 0
      }
    }

我想做的只是将设置/音乐值设置为 0。由于我们丢失了 sfx 值,因此不需要这个结果。

所以我的问题是,如何在不替换整个子对象本身的情况下更新子对象中的值?

4

1 回答 1

2

要设置子文档的特定属性,请使用点表示法。在您的示例中,将其写为:

setPlayerDataField("KingSlizzard", {"settings.music": 0});

请参阅 MongoDB 文档中的示例

要在嵌入文档或数组中指定 <field>,请使用点表示法。

于 2017-08-31T20:51:05.680 回答