Как использовать mongoose «заполнить», чтобы указать путь для уже существующего документа другой коллекции? - PullRequest
0 голосов
/ 29 мая 2018

Я использую Apollo Graphql, Express-Nodejs, MongoDB и Mongoose.У меня есть 2 коллекции, а именно: Бизнес и заказ.

Вот модели

enter image description here

Вот типы графиков: enter image description here

Вот мутация:

createBusiness(
      name: String,
      address: String,
        ): Business

createOrder(
      orderNumber: String,
      businessName: String,
      additionalDetails: String
     ): Order

У определенного бизнеса может быть несколько заказов, у конкретного заказа должен быть один конкретный бизнес.

ЧтоЯ хочу сделать, это создать заказ для бизнес-документа.

Случай 1.) Если бизнес-документ не существует: , тогда мутация createOrder должна создать новый бизнес-документ (с помощью заполнения)

Случай 2.) Но если бизнес-документ существует , то мутация createOrder не должна создавать новый бизнес-документ, а только добавлять новый заказ и ссылку на существующий бизнес-документ.

Может кто-нибудь, пожалуйста, дайте мнезнаете, как я могу выполнить вышеизложенное в graphql и mongoose? Любое предложение будет полезно!

Вот мой распознаватель мутаций Order (не работает, не знаю почему !!)

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 Ответ

0 голосов
/ 01 июня 2018

Я немного изменил логику для случая 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

...