Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

183
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda