Трябва да предоставите множеството ключове на $set
с позиционен $
оператор
за актуализиране на двата съответстващи ключа.
Предпочитам модерния ES6 начин за манипулиране на обекти:
let params = { "_id" : "xxxproductid", "name" : "xxx", "img" : "yyy" };
let update = [
{ 'store.products._id': params._id },
{ "$set": Object.keys(params).filter(k => k != '_id')
.reduce((acc,curr) =>
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
{ })
}
];
User.update(...update,callback);
Което ще създаде извикването на MongoDB като ( с mongoose.set('debug', true)
) е включено, така че виждаме заявката:
Където основно приемате входните си params
и предоставете _id
като първи аргумент за "заявката" :
{ 'store.products._id': params._id },
Останалите вземат „ключовете“ от обекта чрез Object.keys
което прави "масив", който можем да "филтрираме" с Array.filter()
и след това преминете към Масив. намали
за да трансформирате тези ключове в Object
.
Вътре в .reduce()
наричаме Object.assign()код>
който "слива" обекти с дадените ключове, генерирани в тази форма:
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
Използване на синтаксиса на шаблона за присвояване на „текущия“ (curr) „ключ“ в новото име на ключ, отново с помощта на Синтаксис за присвояване на ключ ES6 []:
което позволява имена на променливи в обектни литерали.
Полученият „обединен“ обект се предава обратно, за да бъде присвоен на „основния“ обект, където $set
се използва за ключа на актуализацията, така че "генерираните" ключове вече са деца на това.
Използвам масив за аргументите само за целите на отстраняване на грешки, но това позволява и по-чист синтаксис на действителния .update()
използвайки "разпространението" ...
оператор за присвояване на аргументите:
User.update(...update,callback);
Чисто и просто и някои техники на JavaScript, които трябва да научите за манипулиране на обекти и масиви. Предимно тъй като заявката на MongoDB DSL е основно „Обекти“ и „Масиви“. Затова се научете да ги манипулирате.