Buscar un objeto dentro de un array con mongoose

publicado por: Anonymous

Estoy creando una api en mongoose y nodejs para el siguiente json que tiene un array el cual tiene unos objetos adentro para poder realizar el get_id de mi api, alguien me puede ayudar, es decir necesito obtener el documento que contenga el id especifico para buscarlo y no se el código en mongoose para este proceso.

    {"_id": "5e181fed9fc1883a69797e3a", "hotels":[
        {
        "name" : "Hotel Emperador",
        "stars" : 4,
        "price" : 1596,
        "imagen" : "https://i.ibb.co/RHYqxjL/hotel1.jpg",
        "id": 1
        },

        {
        "name" : "Hotel Sonesta",
        "starts": 4,
        "price" : 2400,
        "imagen" : "https://i.ibb.co/kx06vbZ/hotel2.jpg",
        "id": "sonesta"
        }
        ,
        {

        "name" : "Hotel Soratama",
        "stars" : 3,
        "price" : 1000,
        "imagen" : "https://i.ibb.co/hx0Txk6/hotel3.jpg",
        "id": "3"
        }}

Necesito la siguiente salida cuando haga el find de algún documento con el id.

{
    "name" : "Hotel Emperador",
    "stars" : 4,
    "price" : 1596,
    "imagen" : "https://i.ibb.co/RHYqxjL/hotel1.jpg",
    "id": 1
    }

gracias de antemano

solución

si entiendo bien la estructura… el caso de uso podría ser por ejemplo una colección en donde listas los hoteles disponibles en cada ciudad… por lo que tu colección real tiene más de un documento, y cada documento contiene un array bajo hotels. Algo así?

dado que tienes una colección en donde los elementos tienen la estructura

db={
  comercios: [
    {
      _id: "5e181fed9fc1883a69797e3a",
      hotels: [
        {
          name: "Hotel Emperador",
          stars: 4,
          price: 1596,
          imagen: "https://i.ibb.co/RHYqxjL/hotel1.jpg",
          id: 1
        },
        {
          name: "Hotel Sonesta",
          starts: 4,
          price: 2400,
          imagen: "https://i.ibb.co/kx06vbZ/hotel2.jpg",
          id: "sonesta"
        },
        {
          name: "Hotel Soratama",
          stars: 3,
          price: 1000,
          imagen: "https://i.ibb.co/hx0Txk6/hotel3.jpg",
          id: "3"
        }
      ]
    }
  ]
}

(hago presente que en el texto de tu pregunta tienes un array sin cerrar)

La búsqueda por el id de un documento anidado se haría con un pipeline de agregación:

db.comercios.aggregate([
  {
    $unwind: "$hotels"
  },
  {
    $match: {
      "hotels.id": 1
    }
  }
])

Eso entrega

[
  {
    "_id": "5e181fed9fc1883a69797e3a",
    "hotels": {
      "id": 1,
      "imagen": "https://i.ibb.co/RHYqxjL/hotel1.jpg",
      "name": "Hotel Emperador",
      "price": 1596,
      "stars": 4
    }
  }
]

MongoFiddle

Con mongoose se hace casi igual salvo que en vez de db.comercios sería directamente la colección de Mongoose: mongooseData.aggregate(...)

Si quieres mapear ese array para que ingrese un nivel más de profundidad (pero ojo, al hacer eso pierdes el verdadero _id) agregas al pipeline el reemplazo del objeto raíz:

db.comercios.aggregate([
  {
    $unwind: "$hotels"
  },
  {
    $match: {
      "hotels.id": 1
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$hotels"
    }
  }
])

Y con eso llegamos a lo que quieres:

[
  {
    "id": 1,
    "imagen": "https://i.ibb.co/RHYqxjL/hotel1.jpg",
    "name": "Hotel Emperador",
    "price": 1596,
    "stars": 4
  }
]

(el find sobre la colección siempre devuelve un arreglo, pero en este caso sólo contiene tu el hotel que buscabas)

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *