Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

152
Vistas
Mongoose - Encuentra objetos con cualquier clave y subclave específica

Digamos que tengo una base de datos Mongo que contiene objetos como:

 [ { "test": { "123123": { "someField": null } } }, { "test": { "323143": { "someField": "lalala" }, "121434": { "someField": null } } }, { "test": { "4238023": { "someField": "afafa" } } }, ]

Como puede ver, las teclas justo debajo de "prueba" pueden variar.

Quiero encontrar todos los documentos que tengan al menos un someField que no sea nulo.

Algo así como find : "test.*.someField": { $ne: null } (* representa cualquier valor aquí)

¿Cómo puedo hacer esto en mangosta? Estoy pensando que se necesitará una canalización de agregación aquí, pero no estoy exactamente seguro de cómo.

Restricciones:

  • No tengo mucho control sobre el esquema db en este escenario.
  • Idealmente, no quiero tener que hacer esta lógica en nodeJS, me gustaría consultar directamente a través de la base de datos.
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La parte más complicada aquí es que no puede buscar claves que coincidan con un patrón. Afortunadamente hay una solución. Sí, necesita una canalización de agregación.

Veamos un documento individual:

 { "test": { "4238023": { "someField": "afafa" } } }

Necesitamos consultar someField , pero para llegar a él, debemos eludir de alguna manera 4238023 porque varía con cada documento. ¿Qué pasaría si pudiéramos desglosar ese objeto de test y verlo presentado así:

 { "k": "4238023", "v": { "someField": "afafa" } }

De repente, se vuelve mucho más fácil consultarlo. Bueno, la agregación de mongodb ofrece una función llamada $objectToArray que hace exactamente eso.

Entonces lo que vamos a hacer es:

  1. Convierta el objeto de test en una matriz para cada documento.
  2. Haga coincidir solo los documentos en los que AL MENOS UNO v.someField no sea nulo.
  3. Vuelva a armarlo para que luzca como sus documentos originales, menos los que no coinciden con el criterio nulo.

Entonces, aquí está la canalización que necesita:

 db.collection.aggregate([ { "$project": { "arr": { "$objectToArray": "$$ROOT.test" } } }, { "$match": { arr: { $elemMatch: { "v.someField": { $ne: null } } } } }, { "$project": { "_id": 1, "test": { $arrayToObject: "$arr" } } } ])

Zona de juegos: https://mongoplayground.net/p/b_VNuOLgUb2

Tenga en cuenta que en mongoose ejecutará esta agregación de la misma manera que lo haría en una terminal... bueno, además de .then .

 YourCollection.aggregate([ ... ... ]) .then(result => console.log(result))
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda