Добавление данных в две разные схемы mongodb с использованием узла js

#javascript #node.js #mongodb #mongoose #mongodb-query

Вопрос:

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:

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

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

 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' amp; 'lname' fields inside the object)
 

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

Итак, вы должны сначала добавить магазин, а затем владельца, так как владельцу нужен идентификатор магазина.

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

ownerData.shopPlace = shopPlace.id;
await Owner.create(ownerData);
 

Ответ №2:

напишите контроллер следующим образом:

 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. в модели владельца вы определяете, что тип магазина-это идентификатор объекта, поэтому вам необходимо сохранить идентификатор магазина. в противном случае shopPalace не сможет ссылаться ни на одну модель

2. Я думаю, что таким образом вы сможете решить эту проблему. если возникнут какие-либо вопросы, дайте мне знать. Спасибо.

3. есть ли какая-то иллюзия, чтобы писать каждое тело запроса, так как я написал здесь только два ключа fname n lname, я хочу сократить эти строки, вот почему я написал let newOwmer = new Owner(req.body);

4. есть ли какой-нибудь возможный способ передать здесь идентификатор магазина let newOwmer = new Owner(req.body); ?

5. может быть, это невозможно для этого контроллера

Ответ №3:

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

Это подробно описано в официальных документах мангуста: https://mongoosejs.com/docs/populate.html#saving-refs

Комментарии:

1. У меня есть небольшие сомнения в том, как я передам идентификатор магазина здесь newOwner = await newOwner.save(); , как вы можете видеть, я пишу так let newOwmer = new Owner(req.body); , как я передам идентификатор магазина ? @eol

2. Ну, как вы можете ясно видеть в приведенном выше примере, вы не можете передавать req.body напрямую, вместо этого вы создаете новый объект, в котором вы устанавливаете fname/lname вместе с shopPlace набором для вновь созданного _id .

Ответ №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);
});