更新 MongoDB 个文档子对象而不替换
update MongoDB document sub object without replacing
所以我的数据库中有这个文档,如下所示
{
"_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
}
}
我只想将 settings/music 值设置为 0。这个结果是不需要的,因为我们丢失了 sfx 值。
所以我的问题是,如何在不替换整个子对象本身的情况下更新子对象中的值?
要设置子文档的特定 属性,请使用 dot notation。在您的示例中,将其写为:
setPlayerDataField("KingSlizzard", {"settings.music": 0});
请参阅 MongoDB 文档中的 example。
To specify a <field> in an embedded document or in an array, use dot notation.
所以我的数据库中有这个文档,如下所示
{
"_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
}
}
我只想将 settings/music 值设置为 0。这个结果是不需要的,因为我们丢失了 sfx 值。
所以我的问题是,如何在不替换整个子对象本身的情况下更新子对象中的值?
要设置子文档的特定 属性,请使用 dot notation。在您的示例中,将其写为:
setPlayerDataField("KingSlizzard", {"settings.music": 0});
请参阅 MongoDB 文档中的 example。
To specify a <field> in an embedded document or in an array, use dot notation.