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

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

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 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