Insertar datos en una matriz anidada en mongodb
Tengo un documento que se ve así
{
_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}]
}]
}
]
}
Necesito insertar / enviar algunos datos a la matriz de etiquetas en una categoría seleccionada para un list_id dado, pero aparece un error que dice
MongoError: demasiados posicionales (es decir, '$') elements found in path 'cards.$.categorías. $. etiquetas '
Esta es la consulta que he probado. ¿Qué tiene de malo esta consulta? ¿Alguna idea de cómo lograrlo?
db.collection(TABLE)
.updateOne(
{ list_id: 23, 'cards.categories.category': 'section01'},
{ $push: { 'cards.$.categories.$.tags': { name: 'tag02', id: uuidv4(), is_selected: true } } }
);
Respuestas
No puede usar $ posicional múltiple, para su caso puede usar posicional único y https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/,
El operador posicional filtrado $[<identifier>]identifica los elementos de la matriz que coinciden con las condiciones de arrayFilters para una operación de actualización,
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" }
]
})
https://mongoplayground.net/p/tZqU1RX7JOW
En resumen, no es posible.
Matrices anidadas
El posicional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ marcador de posición es un valor único
https://docs.mongodb.com/manual/reference/operator/update/positional/
Sin embargo, es posible que desee probar $ []
Matrices anidadas El operador posicional filtrado $ [] se puede utilizar para consultas que atraviesan más de una matriz y matrices anidadas.
Para ver un ejemplo, consulte Actualizar matrices anidadas junto con $ [].
https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#position-nested-arrays-filtered
Puedes usar https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#position-nested-arrays-filtered
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
})
intentalo https://mongoplayground.net/p/YWOetb3FR8i