Tengo la siguiente estructura de documentos (simplificada) en mongo:
{ "_id":"5e30208675b5400cb0894c52", "locations": [ { "name": "Pleasure Gardens", "id": 618, "areas": [ { "name": "Koi Pond", "area_id": 159, "is_active": true, }, ...other areas ], ...other locations } ] }Estoy tratando de establecer el campo is_active en la matriz de áreas en falso, donde la identificación de la ubicación es 618 y la identificación del área es 159.
Estoy haciendo lo siguiente:
const db = await connectDb(); return await db .collection('test') .updateOne( {"locations.areas.area_id": 159}, { $set: {"locations.$[l].areas.$[a].is_active": false }}, { arrayFilters: [{ "l.id": 618 }, { "a.area_id": 159 }] } );Pero estoy recibiendo:
MongoError: cannot use the part (locations of locations.$[l].areas.$[a].is_active) to traverse the elementRevisé otras respuestas y, por lo que puedo decir, la sintaxis es correcta y también estoy usando una versión de mongodb que admite el método arrayFilters ("mongodb": "^3.6.3") en nodejs, entonces ¿por qué? siendo tan cruel conmigo? POR QUÉYYY?!?!
ACTUALIZAR
Después de leer los comentarios, me di cuenta de que, aunque tengo instalada la versión 3.6.3 del paquete mongodb npm, la versión de la base de datos en sí es 3.0.14.
Esto significa que el método arrayFilters no es compatible y probablemente tendré que adoptar un enfoque de 2 pasos para resolver este problema:
Para mí funciona correctamente (mongod/mongos versión 4.4.3):
mongos> db.l.find().pretty() { "_id" : "5e30208675b5400cb0894c52", "locations" : [ { "name" : "Pleasure Gardens", "id" : 618, "areas" : [ { "name" : "Koi Pond", "area_id" : 159, "is_active" : true } ] } ]}
mongos> db.l.updateOne( {"locations.areas.area_id": 159} , { $set:{"locations.$[loc].areas.$[are].is_active":false }}, { arrayFilters: [{ "loc.id": 618 }, { "are.area_id": 159 }] } ) // { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } mongos> db.l.find({ "locations.areas.area_id": 159 } ,{"locations.areas.is_active":1 }) // { "_id" : "5e30208675b5400cb0894c52", "locations" : [ { "areas" : [ { "is_active" : false } ] } ] }