MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да актуализирате множество полета на обект от масив с една заявка?

Трябва да предоставите множеството ключове на $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 е основно „Обекти“ и „Масиви“. Затова се научете да ги манипулирате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Извикването на REST API работи само веднъж

  2. Вмъкнете нов обект в поле за масив от поддокумент в mongoose

  3. NotSerializableException org.neo4j.kernel.EmbeddedGraphDatabase

  4. MongoDB/PHP премахва конкретен елемент от масив в документа

  5. MongoDB изглежда избира грешен индекс, когато прави агрегат