thanks for click my question..
I have two schemas in mongodb, citySchema and destinationSchema. I want to make one to many relation. Each destination has one city and the city has many destinations.
This is my 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);
This is 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);
And this is the post route to create new destination
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");
}
});
});
This is my form to create a new destination
<select name="city">
<% cities.forEach(function(city) { %>
<option value=<%=city._id%> > <%= city.name %> </option>
<% }) %>
</select>
It works fine. But I want when i create a new destination, it push current destination id to city schema (destinations array) .
Sorry for my bad English. I appreciate every your answers and suggestions. And Thank you 😊
After you create a new destination, you can push that destination's id to the city destinations.
You can use the following route:
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");
}
});
Let's have an existing city like this:
{
"destinations": [],
"_id": "5e071f212e9ecd31508785c6",
"name": "Padang",
"image": "image 1",
"description": "beautiful city",
"__v": 0
}
If we want to add this city a destination, we can send this request body to our post route. Please note that as city value, we need to use an existing city id ( 5e071f212e9ecd31508785c6
) like the one we have already.
{
"name": "destination name",
"image": "destination image",
"description": "destination description",
"city": "5e071f212e9ecd31508785c6"
}
The result will be like this:
A new destionation is created:
{
"_id" : ObjectId("5e071fd51cd3600bb083b5e7"),
"name" : "destination name",
"image" : "destination image",
"description" : "destination description",
"city" : ObjectId("5e071f212e9ecd31508785c6"),
"__v" : NumberInt(0)
}
And added to the city:
{
"_id" : ObjectId("5e071f212e9ecd31508785c6"),
"destinations" : [
ObjectId("5e071fd51cd3600bb083b5e7")
],
"name" : "Padang",
"image" : "image 1",
"description" : "beautiful city",
"__v" : NumberInt(0)
}
After creating a destination, use mongoose findOneAndUpdate
method to update the relevant city.
As the name implies, findOneAndUpdate() finds the first document that matches a given filter, applies an update, and returns the document.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.