Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

189
Views
actualización de mongoDB con arrayFilters no funciona

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 element

Revisé 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:

  1. consulta mongodb para encontrar el documento:
  • almacenar el resultado en una variable
  • actualice la variable en el código mismo con (cambie is_active a false)
  1. use una consulta de actualización para sustituir todo el documento en mongo con el documento almacenado en variable (en lugar de solo actualizar el área deseada)
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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 } ] } ] }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!