Как обновить вложенный массив документов с помощью слияния Мангуста с $set

#node.js #typescript #mongodb #mongoose

Вопрос:

в моем приложении определены следующие схемы:

     const PlanVariantSchema = new mongoose.Schema({
    sku: {
        type: String,
        required: true,
    },

    name: {
        es: {
            type: String,
        },
        en: {
            type: String,
        },
    },

    price: {
        type: Number,
        required: true,
    },

    attributes: [
        {
            key: {
                es: {
                    type: String,
                },
                en: {
                    type: String,
                },
            },

            value: {
                es: {
                    type: String,
                },
                en: {
                    type: String,
                },
            },
        },
    ],
});

const PlanSchema = new mongoose.Schema(
    {
        _id: {
            type: String,
            default: uuid.v4,
        },
        name: {
            es: {
                type: String,
                required: true,
            },
            en: {
                type: String,
                // required: true,
            },
        },


        sku: {
            type: String,
            required: true,
            unique: true,
        },

        variants: [PlanVariantSchema],

        deletionFlag: {
            type: Boolean,
            isRequired: true,
            default: false,
        },
    },
    { collection: "Plan", timestamps: true }
);
 

КАК вы можете видеть, некоторые атрибуты открываются в 2 ключах (es, en), так как мое приложение должно поддерживать I18n. Когда я обновляю план, я снова сохраняю все значения, но объединяю поля, поддерживающие языковой стандарт (например, имя или описание). У меня нет проблем с этим, моя проблема в том, что я не могу найти способ обновить, например, атрибут «атрибуты» (извините за название), который представляет собой массив внутри PlanVariants, который является массивом внутри плана.

Поискав в документации mongo, я нашел positionl $ opreator, но я не думаю, что это решает мою проблему, потому что я прочитал все примеры, и этот оператор полезен для обновления определенного поля всех элементов массива одним значением, но я пытаюсь обновить массив атрибутов новыми элементами attirbutes, объединяя поля с ключами локали (en, es).

Есть ли какой-либо способ выполнить это глубокое вложенное обновление, объединив определенные поля на самом низком уровне?

Вот как я обновляю атрибуты плана на первом уровне:

 public async save(plan: Plan): Promise<void> {
    const planDb = planMapper.toPersistence(plan);
    if (await MongoosePlan.exists({ _id: plan.id.value })) {
        const { name, description, ...planToUpdate } = planDb;
        const nameLocaleKey = `name.${plan.locale}`;
        const descriptionLocaleKey = `description.${plan.l

        await MongoosePlan.updateOne(
            { _id: plan.id.value },
            { ...planToUpdate, $set: { [nameLocaleKey]: name[plan.locale], [descriptionLocaleKey]: description[plan.locale] } }
        );
    } else {
        await MongoosePlan.create(planDb);
    }
}