Gracias por hacer clic en mi pregunta ..

Tengo dos esquemas en mongodb, citySchema y destinationSchema. Quiero hacer una relación de uno a muchos. Cada destino tiene una ciudad y la ciudad tiene muchos destinos.

Este es mi destinationSchema

var mongoose = require("mongoose");
var destinationSchema = new mongoose.Schema({
  name: String,
  image: String,
  description: String,
  city: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "City"
  }
});

module.exports = mongoose.model("Destination", destinationSchema);

Esto es citySchema

var mongoose = require("mongoose");
var citySchema = new mongoose.Schema({
  name: String,
  image: String,
  description: String,
  destinations: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Destination"
    }
  ]
});

module.exports = mongoose.model("City", citySchema);

Y esta es la ruta de publicación para crear nuevo destino

router.post("/", function(req, res) {
  var name = req.body.name;
  var image = req.body.image;
  var description = req.body.description;
  var city = req.body.city;
  var newDestination = {
    name: name,
    image: image,
    description: description,
    city: city
  };
  Destination.create(newDestination, function(err, newCreatedDestination) {
    if (err) {
      console.log(err);
    } else {
      res.redirect("/admin/destinations");
    }
  });
});

Este es mi formulario para crear un nuevo destino

<select name="city">
   <% cities.forEach(function(city) { %>
      <option value=<%=city._id%> > <%= city.name %> </option>
   <% }) %>
 </select>

Funciona bien. Pero quiero cuando creo un nuevo destino, empuja la identificación del destino actual al esquema de la ciudad (matriz de destinos) .

Perdón por mi mal ingles. Agradezco cada una de sus respuestas y sugerencias. Y gracias 😊

1
Ikhsannul Hijri 28 dic. 2019 a las 08:44

2 respuestas

La mejor respuesta

Después de crear un nuevo destino, puede enviar la identificación de ese destino a los destinos de la ciudad.

Puedes usar la siguiente ruta:

router.post("/", async (req, res) => {
  try {
    const { name, image, description, city } = req.body;

    let newDestination = { name, image, description, city };

    newDestination = await Destination.create(newDestination);

    let result = await City.findByIdAndUpdate(
      city,
      {
        $push: { destinations: newDestination._id }
      },
      { new: true }
    );

    res.redirect("/admin/destinations");
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

Tengamos una ciudad existente como esta:

{
    "destinations": [],
    "_id": "5e071f212e9ecd31508785c6",
    "name": "Padang",
    "image": "image 1",
    "description": "beautiful city",
    "__v": 0
}

Si queremos agregar a esta ciudad un destino, podemos enviar este cuerpo de solicitud a nuestra ruta posterior. Tenga en cuenta que, como valor de la ciudad, debemos usar un ID de ciudad existente (5e071f212e9ecd31508785c6) como el que ya tenemos.

{
    "name": "destination name",
    "image": "destination image",
    "description": "destination description",
    "city": "5e071f212e9ecd31508785c6"
}

El resultado será así:

Se crea un nuevo destino:

{
    "_id" : ObjectId("5e071fd51cd3600bb083b5e7"),
    "name" : "destination name",
    "image" : "destination image",
    "description" : "destination description",
    "city" : ObjectId("5e071f212e9ecd31508785c6"),
    "__v" : NumberInt(0)
}

Y añadido a la ciudad:

{
    "_id" : ObjectId("5e071f212e9ecd31508785c6"),
    "destinations" : [
        ObjectId("5e071fd51cd3600bb083b5e7")
    ],
    "name" : "Padang",
    "image" : "image 1",
    "description" : "beautiful city",
    "__v" : NumberInt(0)
}
1
SuleymanSah 28 dic. 2019 a las 09:48

Después de crear un destino, use el método de mangosta findOneAndUpdate para actualizar la ciudad relevante.

Como su nombre lo indica, findOneAndUpdate () encuentra el primer documento que coincide con un filtro determinado, aplica una actualización y devuelve el documento.

Mangosta findOneAndUpdate

1
Mian Muhammad 28 dic. 2019 a las 09:45