#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);
, как я передам идентификатор магазина ? @eol2. Ну, как вы можете ясно видеть в приведенном выше примере, вы не можете передавать
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);
});