#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/
Однако вы можете попробовать $[]
Вложенные массивы Отфильтрованный позиционный оператор $[] может использоваться для запросов, которые пересекают более одного массива и вложенных массивов.
Для примера см. раздел Обновление вложенных массивов в сочетании с $[] .
Ответ №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
})
попробуйте это здесь