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.
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.
Consulta
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)
Consulta
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 } ])