Вставка данных во вложенный массив в mongodb

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

У меня есть документ, который выглядит следующим образом

 {
 _id:1,
 list_id:23,
 name:'list01'
 cards:[
  {
   id:3,
   name:'card01'
   categories:[{
    id:10,
    category:'section01',
    tags:[{id:11,name:'tag01',is_selected: true}]
  }] 
  }
 ]
}
  

Мне нужно вставить / вставить некоторые данные в массив тегов в выбранной категории для заданного list_id, но я получаю сообщение об ошибке

Ошибка MongoError: слишком много позиционных (т.Е. ‘$’) Элементов найдено в пути ‘cards.$.categories.$.tags’

Это запрос, который я опробовал. Что не так с этим запросом, есть идеи о том, как этого добиться?

 db.collection(TABLE)
    .updateOne(
      { list_id: 23, 'cards.categories.category': 'section01'},
      { $push: { 'cards.$.categories.$.tags': { name: 'tag02', id: uuidv4(), is_selected: true } } }
    );
  

Комментарии:

1. невозможно использовать несколько $ positional, используйте arrayFilters ,

Ответ №1:

Вы не можете использовать несколько $ positional, для вашего случая вы можете использовать одиночные позиционные и массивные фильтры,

Оператор filtered positional $[<identifier>] определяет элементы массива, которые соответствуют условиям arrayFilters для операции обновления,

 db.collection(TABLE).updateOne({
  list_id: 23,
  "cards.categories.category": "section01"
},
{
  $push: {
    "cards.$.categories.$[elem].tags": {
      name: "tag02",
      id: uuidv4(),
      is_selected: true
    }
  }
},
{
  arrayFilters: [
    { "elem.category": "section01" }
  ]
})
  

Игровая площадка

Ответ №2:

Короче говоря, это невозможно.

Вложенные массивы

Позиционный оператор $ нельзя использовать для запросов, которые пересекают более одного массива, таких как запросы, которые пересекают массивы, вложенные в другие массивы, поскольку замена заполнителя $ является единственным значением

https://docs.mongodb.com/manual/reference/operator/update/positional/

Однако вы можете попробовать $[]

Вложенные массивы Отфильтрованный позиционный оператор $[] может использоваться для запросов, которые пересекают более одного массива и вложенных массивов.

Для примера см. раздел Обновление вложенных массивов в сочетании с $[] .

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#position-nested-arrays-filtered

Ответ №3:

Вы можете использовать $[идентификатор]

 db.collection.update({
  "list_id": 23,
  "cards.categories.category": "section01"
},
{
  $push: {
    "cards.$.categories.$[elem].tags": {
      name: "tag02",
      id: uuidv4(),
      is_selected: true
    }
  }
},
{
  arrayFilters: [
    {
      "elem.category": "section01"
    }
  ],
  multi: true
})
  

попробуйте это здесь