Cuando se usa $mergeObjects en la canalización de actualización, el objeto original se sobrescribe. ¿Hay alguna alternativa para evitar que esto suceda o se puede $mergeObjects de alguna manera para evitarlo?
Tengo un documento de la siguiente manera:
{ "employment": { "selfEmployed": { "netProfit": 1000, "addbacks": [ { "addbackId": "5a934e000102030405000001", "value": 1000, } ] } } }Tengo datos de actualización de la siguiente manera:
const update = { "selfEmployed": { "netProfit": 22, } };La consulta de actualización es:
db.collection.update({}, [ { $set: { "employment": { $mergeObjects: [ "$employment", update ] } } } ]) Sin embargo $mergeObjects sobrescribe el objeto para dar el siguiente resultado:
{ "employment": { "selfEmployed": { "netProfit": 22 } } }Resultado Esperado:
{ "employment": { "selfEmployed": { "netProfit": 22, "addbacks": [ { "addbackId": "5a934e000102030405000001", "value": 1000, } ] } } }Edición 1:
Solo puedo confiar en el campo de nivel superior para realizar la actualización. Algunas respuestas a continuación funcionan para selfEmployed . Pero también tengo otros campos en la colección. p.ej
{ "employment": { "selfEmployed": { "netProfit": 1000, "addbacks": [ { "addbackId": "5a934e000102030405000001", "value": 1000, } ] }, "unemployed": { "reason": "some reason", //... other data } // .. other data } }Y no quiero repetir o escribir varias consultas para actualizar los campos anidados y usar el conjunto directo tampoco es una opción. Estoy buscando una manera de usar la canalización de actualización como he indicado anteriormente.
Según $mergeObjects Behavior ,
$mergeObjects sobrescribe los valores de campo a medida que fusiona los documentos. Si los documentos para fusionar incluyen el mismo nombre de campo, el campo, en el documento resultante, tiene el valor del último documento fusionado para el campo.
Por lo tanto, el employment.selfEmployed original.selfEmployed se reemplazará con el nuevo valor.
Solución 1: Valor directo $set para employment.selfEmployed.netProfit .
db.collection.update({}, [ { $set: { "employment.selfEmployed.netProfit": 22 } } ])Muestra de Mongo Playground para la Solución 1
Solución 2: $mergeObjects para employment.selfEmployed . SelfEmployed únicamente.
db.collection.update({}, [ { $set: { "employment.selfEmployed": { $mergeObjects: [ "$employment.selfEmployed", { "netProfit": 22 } ] } } } ])