首页 文章

如何使用mongoose“populate”来指定不同集合的现有文档的路径?

提问于
浏览
0

我正在使用Apollo Graphql,Express-Nodejs,MongoDB和Mongoose . 我有2个集合:商业和订单 .

这是模型

enter image description here

以下是graphql类型:
enter image description here

这是突变:

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

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

特定的业务可以有多个订单,特定的订单必须具有一个特定的业务 .

我想要做的是为Business文档创建一个订单 .

Case 1.) If the Business document doesn't exists: 然后createOrder变异应该创建新的业务文档(通过使用填充)

Case 2.) But If the Business document exists ,然后createOrder变异不应创建新的业务单据,只应添加新订单和对现有业务单据的引用 .

Could someone please let me know how can I fulfill the above in the graphql and 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 回答

  • 0

    我略微修改了案例1的逻辑,这样如果商业名称不存在,则不应该允许创建订单 . 好像有人未经授权允许在订单变异中创建业务,那么我们可能必须处理其他可选参数(仅针对案例1),使“createOrder”变异更加麻烦且不那么合乎逻辑 .

    相反,我们会向客户端用户通知案例1的一些有用的消息,而对于案例2,当业务存在时,我们会:

    1.)首先创建新订单,然后将其推送到业务类型的"orders"列表,然后保存它(因为类型业务需要这个对其子订单数组的引用)(请阅读:Saving Refs to Children

    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()只有在没有任何参数的情况下才会返回promise,所以我就这样返回了 . 有关这方面的更多信息,请查看this awesome explained stackoverflow post

相关问题