#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")
);