обновить вложенные данные объекта без изменения идентификатора объекта - PullRequest
1 голос
/ 16 мая 2019

В настоящее время я использую фильтры массива для обновления вложенного объекта.Моя структура -

Category Collection - 
{
  name:Disease,
  _id:ObjectId,
  subCategory:[{
    name:Hair Problems,
    _id:ObjectId,
    subSubCategory:[{
       name: Hair Fall,
       _id:ObjectId
    },{
       name: Dandruff,
       _id:ObjectId
    }]
  }]
}

Я хочу обновить подкатегорию с идентификатором 1.1.1, что я делаю, используя фильтры массива.

let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { $set: { 'subCategories.$.subSubCategories.$[j]': data } };
let option = { arrayFilters: [{ 'j._id': subSubId }], new: true };

await Categories.findOneAndUpdate(query, update, option

Этот код работает нормально, но фильтры массиваизменить идентификатор объекта subsubCategory.Есть ли другая альтернатива сделать это без изменения ObjectId.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Вы можете циклически перебирать ключи, которые вы получаете в качестве полезных данных, и помещать их в оператор $set.

const data = {
  firstKey: "key",
  secondKey: "key2",
  thirdKey: "key3"
}
const object = {}

for (var key in data) {
  object[`subCategories.$.subSubCategories.$[j].${key}`] = data[key]
}

let query = { 'subCategories.subSubCategories._id': subSubId };
let update = { '$set': object };
let option = { 'arrayFilters': [{ 'j._id': subSubId }], 'new': true };

await Categories.findOneAndUpdate(query, update, option)
1 голос
/ 16 мая 2019

Проблема в строке $set, там вы не упомянули конкретные поля для обновления, вместо этого subCategory.$.subSubCategory.$[j] заменит полный элемент объекта, который соответствует фильтру _id.Следовательно, ваше поле _id также обновляется.Вы должны явно указать имя поля после идентификатора элемента массива.См. Пример ниже:

Предположим, вы хотите обновить поле name в subSubCategories с Dandruff до new Dandruff.Затем сделайте так:

let update = { $set: { 'subCategories.$.subSubCategories.$[j].name': "new Dandruff" } };

Это только обновит поле name в subSubCategories массиве

...