Mongodb редактирует определенные поля во вложенном документе

#mongodb #mongo-cxx-driver

#mongodb #mongo-cxx-driver

Вопрос:

Использование update_one() с помощью $set позволяет мне обновлять определенные поля или добавлять новые поля в документ. Другие поля в документе не затрагиваются.

При работе с вложенными документами поведение update_one() и $set не согласуется. Например, здесь я пытаюсь обновить вложенный документ таким же образом, но все существующие поля внутри вложенного документа заменяются. Все существующие подполя, на которые не ссылается команда update_one(), будут удалены. Например:

 {
"_id" : ObjectId("5fd6866b3866cb3a10000012"),
"firstName" : "jane",
"lastName" : "doe",
"calculatedFields" : {
    "field1" : "a",
    "field2" : "b",
    "field3" : "c"
}
 

}

Здесь я пытаюсь отредактировать 1 и добавить 3 новых поля в поддокумент ‘calculatedFields’:

 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()
);
 

Ответ №1:

Я понял это, это было мое отсутствие общих знаний mongodb. Я был недостаточно конкретен, и вот рабочее решение:

 document subfields;
subfields.append(
    kvp("calculatedFields.field3", "x"),
    kvp("calculatedFields.field4", "d"),
    kvp("calculatedFields.field5", "e"),
    kvp("calculatedFields.field6", "f")
);