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