【问题标题】:Adding data into two different mongodb Schema using node js使用节点 js 将数据添加到两个不同的 mongodb Schema
【发布时间】:2021-11-11 05:51:27
【问题描述】:

ownerSchema.js

var ownerSchema = Schema({
    fname     : String,
    lname     : String,
    shopPlace : { 
                  type: Schema.Types.ObjectId,
                  ref: 'Shop'
                }
});
var Owner = mongoose.model('Owner', ownerSchema);

shopSchema.js

var shopSchema = Schema({
    shopName  : String,
    location  : String,
    startDate : Date,
    endDate   : Date
});
var Shop  = mongoose.model('Shop', shopSchema);

所以这是我的两个不同架构,我正在尝试在这两个架构中插入数据,但不知道确切的方式,因为我编写了添加数据的代码,但针对单个架构

const Owner = require("../models/ownerSchema");

const addTask = async (req, res) => {
  let newOwmer = new Owner(req.body);
  try {
    newOwner = await newOwner.save();
    console.log("Added Successfully");
  } catch (err) {
    console.log(err);
  }
};

在这里我想知道如何通过邮递员添加数据我从邮递员发送这样的数据

{
  "fname"     : "tom",
  "lname"     : "Jerry",
  "ShopPlace" : {
                 "shopName" : "Juice Shop",
                 "location" : "Mumbai"
                 }
}

因为它向我显示了这个错误

owner validation failed: Shop: Cast to ObjectId failed for value

如何在 mongodb 中发送和存储数据?

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongodb-query


    【解决方案1】:

    您首先需要创建您的shop 并将生成的id 传递给您要创建的owner。这是一个例子(当然仍然需要验证和错误处理):

    const shop = new Shop({  
      shopName: req.body.ShopPlace.shopName
      location: req.body.ShopPlace.location
    });    
    await shop.save();
    
    const owner = new Owner({
                fname: req.body.fname, 
                lname: req.body.lname, 
                shopPlace: shop._id
    });
    await owner.save();
    

    官方mongoose-docs中有详细描述:https://mongoosejs.com/docs/populate.html#saving-refs

    【讨论】:

    • 我有点怀疑我将如何在这里传递店铺 ID newOwner = await newOwner.save();,正如你所看到的,我正在这样写 let newOwmer = new Owner(req.body); 那么我将如何传递店铺 ID? @eol
    • 正如您在上面的示例中清楚地看到的那样,您不能直接传递req.body,而是创建一个新对象,将fname/lnameshopPlace 一起设置为新创建的@ 987654331@.
    【解决方案2】:
    {
        "fname"     : "tom",
        "lname"     : "Jerry",
        "ShopPlace" : {
            "shopName" : "Juice Shop",
            "location" : "Mumbai"
        }
    }
    

    由于这是您的数据,因此您是从邮递员发送的。因此,首先您需要将 Shop & Owner 信息与此对象分开。

    const ownerData = req.body;             // complete request body
    const shopData  = ownerData.ShopPlace;  // pluck only "shopPlace" field from the object
    delete ownerData.ShopPlace;             // now, remove the "shopPlace" field from main object (this will leave only 'fname' & 'lname' fields inside the object)
    

    您的代码出错,因为商店的 ID(即 shopPlace)不是 在将其添加到所有者集合之前创建。

    因此,您必须先添加 Shop,然后再添加 Owner,因为所有者需要 shop 的 id。

    const shopPlace = new Shop(shopData);   // This `shopData` is from above step
    await shopPlace.save();
    
    ownerData.shopPlace = shopPlace.id;
    await Owner.create(ownerData);
    

    【讨论】:

      【解决方案3】:

      这样写控制器:

      app.post('/create', async (req, res) => {
        const owner = new Owner({
          fname: req.body.fname,
          lname: req.body.lname,
        });
        await owner.save();
        const shop = new Shop({
          shopName: req.body.shopName,
          location: req.body.location,
          startDate: req.body.startDate,
          endDate: req.body.endDate,
        });
        await shop.save();
        const update = await Owner.findByIdAndUpdate(owner._id, {
          shopPlace: shop._id,
        });
        res.send(update);
      });
      

      在这里我将数据发送到控制器:

      {
        "fname": "First Name",
        "lname": "Last Name",
        "shopName"  : "Shop Name",
        "location"  : "location Name",
        "startDate" : "2011-10-05T14:48:00.000Z",
        "endDate"   : "2011-10-05T14:48:00.000Z"
      }
      

      【讨论】:

      • 在 Owner 模型中,您将 shopPlace 类型定义为 ObjectId,这就是您必须保存商店 ID 的原因。否则 shopPalace 不能引用任何模型
      • 我认为通过这种方式你可以解决这个问题。如果有任何疑问,请告诉我。谢谢。
      • 是否有必要写每个 req.body 因为我在这里只写了两个键 fname n lname 我想减少那些行这就是我写let newOwmer = new Owner(req.body);
      • 有什么方法可以让我在这里传递店铺ID let newOwmer = new Owner(req.body); ?
      • 这个控制器可能不行
      【解决方案4】:

      另外,你可以这样做

      app.post('/create', async (req, res) => {
        const shop = new Shop({
          shopName: req.body.shopName,
          location: req.body.location,
          startDate: req.body.startDate,
          endDate: req.body.endDate,
        });
        await shop.save();
        const owner = new Owner({
          fname: req.body.fname,
          lname: req.body.lname,
          shopPlace: shop._id,
        });
        await owner.save();
        res.send(owner);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 2015-10-07
        • 2018-06-02
        • 2021-11-19
        • 2021-11-12
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多