簡體   English   中英

Mongodb 編輯子文檔中的特定字段

[英]Mongodb editing specific fields within a subdocument

使用帶有$setupdate_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM