Я использую Apollo Graphql, Express-Nodejs, MongoDB и Mongoose. У меня есть 2 коллекции, а именно: Бизнес и Заказ.
Вот модели
Вот мутации:
createBusiness(
name: String,
address: String,
): Business
createOrder(
orderNumber: String,
businessName: String,
additionalDetails: String
): Order
Конкретный бизнес может иметь несколько заказов. В конкретном заказе должен быть один конкретный бизнес.
Я хочу создать заказ на бизнес-документ.
Случай 1.) Если Бизнес-документ не существует:, тогда мутация createOrder должна создать новый бизнес-документ (с помощью заполнения)
Случай 2.) Но если бизнес-документ существует, то мутация createOrder не должна создавать новый бизнес-документ, а только добавлять новый заказ и ссылку на существующий бизнес-документ.
Может кто-нибудь, дайте мне знать, как я могу выполнить вышеуказанное в graphql и mongoose? Любое предложение было бы полезным!
Вот мой преобразователь мутации порядка (он не работает, не знаю почему !!)
import Order from '../models/Order';
import Business from '../models/Business';
export default {
Mutation:{
createOrder(_, {
orderNumber,
additionalDetails,
businessName
}){
return Business.findOne({
businessName: businessName
})
.then((exist)=>{
if (!exist){
let business_Name = new Business({
name: businessName
})
business_Name.save(function (err){
if (err) return handleError(err);
let order = new Order({
orderNumber: orderNumber,
businessName: business_Name._id,
additionalDetails: additionalDetails
});
order.save(function (err){
if (err) return handleError(err);
});
});
}
if (exist){
// WHAT SHOULD I DO FOR THIS CASE ??
}
});
},
}
}
Заранее спасибо !





Я немного изменил логику для случая 1, так что если бизнес-имя не существует, то не должно быть разрешено создавать заказ. Если кому-то неавторизованному разрешено создавать бизнес в мутации порядка, тогда нам, возможно, придется обрабатывать дополнительные необязательные аргументы (только для случая 1), делая мутацию «createOrder» более громоздкой и не такой логичной.
Скорее, мы бы проинформировали пользователя клиента с некоторыми полезными сообщениями для случая 1 и для случая 2, когда бизнес существует, мы должны:
1.) Сначала создайте новый заказ, затем поместите его в список «заказов» типа Business и затем сохраните его (поскольку типу Business нужна эта ссылка на его дочерний массив заказов) (прочтите это: Сохранение ссылок для детей)
2.) Затем пришло время сохранить вновь созданный заказ и заполнить "businessReference".
Вот полный код мутации createOrder ...
createOrder: async(_, {
orderNumber,
additionalDetails,
businessName
})=>{
// Check if the business name exists or not
try {
const business_name = await Business.findOne({
name: businessName
})
if (!business_name){
throw new Error ('Business name not found. Please create the Business first !');
}
// if the business name exists, then
// first create order
let order = await new Order({
orderNumber: orderNumber,
businessReference: business_Name._id,
additionalDetails: additionalDetails
})
business_name.orders.push(order); // then push this order to child
business_name.save(); // array of Business for referencing
// it later
return order.save() //then save the order,
.then(res => Order.findById(res._id) // and populate
.populate('businessReference')
.exec())
}
catch (error) {
throw error;
}
}
Поскольку exec () вернет обещание только в том случае, если у него нет аргументов, я вернул его таким образом. Для получения дополнительной информации об этом, пожалуйста, загляните в это удивительное объясненное сообщение stackoverflow