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?

1
Aakash 16 Сен 2021 в 11:34

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);
});
0
Sakil Khan 16 Сен 2021 в 09:58
{
    "fname"     : "tom",
    "lname"     : "Jerry",
    "ShopPlace" : {
        "shopName" : "Juice Shop",
        "location" : "Mumbai"
    }
}

Поскольку это ваши данные, вы отправляете их от почтальона. Итак, сначала вам нужно отделить информацию о магазине и владельце от этого объекта.

const ownerData = req.body;
const shopData  = ownerData.ShopPlace;
delete ownerData.ShopPlace;

Ваш код выдает ошибку, потому что идентификатор магазина (т.е. shopPlace ) не создается перед добавлением его в коллекцию владельца. Итак, вам нужно сначала добавить Магазин , а затем Владелец , так как владельцу нужен идентификатор магазина.

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

ownerData.shopPlace = shopPlace.id;
await Owner.create(ownerData);
1
TalESid 16 Сен 2021 в 09:15

Напишите контроллер так:

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"
}
1
Sakil Khan 16 Сен 2021 в 09:46

Сначала вам нужно создать свой 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

1
eol 16 Сен 2021 в 10:31