[英]Mongodb editing specific fields within a subdocument
使用帶有$set的update_one()可以更新特定字段或向文檔添加新字段。 文檔中的其他字段不受影響。
使用子文檔時, update_one() 和 $set 行為不一致。 例如,這里我嘗試以相同的方式更新子文檔,但子文檔中的現有字段全部被替換。 update_one() 命令中未引用的任何現有子字段都將被刪除。 例如:
{
"_id" : ObjectId("5fd6866b3866cb3a10000012"),
"firstName" : "jane",
"lastName" : "doe",
"calculatedFields" : {
"field1" : "a",
"field2" : "b",
"field3" : "c"
}
}
在這里,我嘗試編輯 1 並向“calculatedFields”子文檔添加 3 個新字段:
document subfields;
subfields.append(
kvp("field3", "x"),
kvp("field4", "d"),
kvp("field5", "e"),
kvp("field6", "f")
);
doc.append(
kvp("calculatedFields", subfields)
);
document update;
update.append(
kvp("$set", doc)
);
auto result = collection.update_one(
match.view(),
update.view()
);
以下是結果,您可以看到現有子字段已被刪除:
{
"_id" : ObjectId("5fd6866b3866cb3a10000012"),
"firstName" : "jane",
"lastName" : "doe",
"calculatedFields" : {
"field3" : "x",
"field4" : "d",
"field5" : "e",
"field6" : "f",
}
}
這是我對 update_one() 操作的預期結果:
{
"_id" : ObjectId("5fd6866b3866cb3a10000012"),
"firstName" : "jane",
"lastName" : "doe",
"calculatedFields" : {
"field1" : "a",
"field2" : "b",
"field3" : "x",
"field4" : "d",
"field5" : "e",
"field6" : "f",
}
}
這是查看我正在做的事情的簡化方法,它做了完全相同的事情並導致完全相同的結果:
document subfields;
subfields.append(
kvp("calculatedFields",
make_document(
kvp("field3", "x"),
kvp("field4", "d"),
kvp("field5", "e"),
kvp("field6", "f")
)
)
);
document update;
update.append(
kvp("$set", subfields)
);
auto result = collection.update_one(
match.view(),
update.view()
);
我想通了,這是我缺乏一般的 mongodb 知識。 我不夠具體,這是可行的解決方案:
document subfields;
subfields.append(
kvp("calculatedFields.field3", "x"),
kvp("calculatedFields.field4", "d"),
kvp("calculatedFields.field5", "e"),
kvp("calculatedFields.field6", "f")
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.