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

155
Vistas
Consultando dentro de una matriz de subdocumentos en mongodb

Soy realmente nuevo en la base de datos MongoDB o NoSQL. Tengo este esquema userSchema

 const postSchema = { title: String, posted_on: Date } const userSchema = { name: String, posts: [postSchema] }

Quiero recuperar las publicaciones de un usuario en el rango dado (/api/users/:userId/posts?from=date&to=date&limit=limit) usando la consulta mongodb . En una base de datos relacional, generalmente creamos dos conjuntos diferentes de tablas y consultamos la segunda tabla (publicaciones) usando alguna condición y obtenemos el resultado requerido. ¿Cómo podemos lograr lo mismo en mongodb? Intenté usar $elemMatch al referirme a esto , pero parece que no funciona.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

2 formas de hacerlo con el marco de agregación, que puede hacer mucho más de lo que puede hacer un hallazgo.

Con find , en su mayoría seleccionamos documentos de una colección o proyecto para mantener algunos campos de un documento que está seleccionado, pero aquí solo necesita algunos miembros de una matriz, por lo que se usa la agregación.

Modo local (solución a nivel de documento) sin desconexión, etc.

Código de prueba aquí

Consulta

  • filtre la matriz y mantenga solo publicado_en> 1 y <4 (utilicé números para simplificar las fechas de uso, es lo mismo)
  • tomar los primeros 2 elementos de la matriz (límite 2)
 db.collection.aggregate([ { "$match": { "name": { "$eq": "n1" } } }, { "$set": { "posts": { "$slice": [ { "$filter": { "input": "$posts", "cond": { "$and": [ { "$gt": [ "$$this.posted_on", 1 ] }, { "$lt": [ "$$this.posted_on", 5 ] } ] } } }, 2 ] } } } ])

Solución Uwind (solución a nivel de colección) (es un poco más pequeño, pero mantener las cosas locales es mejor, pero en su caso no importa)

Código de prueba aquí

Consulta

  • coincidir con el usuario
  • desenrolle la matriz y haga que cada miembro sea ROOT
  • hacer coincidir las fechas >1 <4
  • límite 2
 db.collection.aggregate([ { "$match": { "name": { "$eq": "n1" } } }, { "$unwind": { "path": "$posts" } }, { "$replaceRoot": { "newRoot": "$posts" } }, { "$match": { "$and": [ { "posted_on": { "$gt": 1 } }, { "posted_on": { "$lt": 5 } } ] } }, { "$limit": 2 } ])
about 4 years ago · Juan Pablo Isaza 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