【问题标题】:How to push data to another schema in nodejs mongodb如何将数据推送到nodejs mongodb中的另一个模式
【发布时间】:2020-04-17 21:06:09
【问题描述】:

感谢您点击我的问题..

我在mongodb中有两个schema,citySchema和destinationSchema。我想建立一对多的关系。每个目的地都有一个城市,而这个城市有很多目的地。

这是我的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);

这是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);

这是创建新目的地

的发布路线
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");
    }
  });
});

这是我创建新目的地

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

它工作正常。但我希望在创建新目的地时,将当前目的地 ID 推送到城市架构(目的地数组)

对不起,我的英语不好。我感谢您的每一个回答和建议。还有谢谢???

【问题讨论】:

    标签: node.js mongodb express mongoose ejs


    【解决方案1】:

    创建新目的地后,您可以将该目的地的 id 推送到城市目的地。

    您可以使用以下路线:

    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");
      }
    });
    

    让我们有一个这样的现有城市:

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

    如果我们想将此城市添加为目的地,我们可以将此请求正文发送到我们的发布路线。请注意,作为城市值,我们需要使用现有的城市 ID (5e071f212e9ecd31508785c6),就像我们已经拥有的一样。

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

    结果会是这样的:

    创建了一个新目标:

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

    并添加到城市:

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

    【讨论】:

      【解决方案2】:

      创建目的地后,使用猫鼬findOneAndUpdate方法更新相关城市。

      顾名思义,findOneAndUpdate() 查找第一个 匹配给定的过滤器,应用更新并返回文档。

      Mongoose findOneAndUpdate

      【讨论】:

        猜你喜欢
        • 2020-11-25
        • 2019-08-29
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 2021-12-13
        相关资源
        最近更新 更多