在MongoDB中处理两个模型之间的一对多关系

时间:2018-11-26 17:56:03

标签: javascript node.js database mongodb graphql

我正在尝试在后端使用MongoDB,Express和GraphQL(Apollo客户端/服务器)创建一个电子商务应用程序,但是我在让用户向其存储在数据库中的购物车中添加某些内容时遇到问题。

到目前为止,我的数据库中有三个模型:UserItemCartItem

我遇到的问题是我有一个用户模型,该用户模型具有一个cart字段,该字段是CartItem的数组。

然后我有了一个CartItem模型,该模型具有item(在购物车中将cartItem映射到原始Item)和user引用。

从前端启动Mutation后,如果服务器上没有addtoCart,则我有一个CartItem解析器,它会创建一个新的CartItemuser.id或仅更新item.id的数量(如果确实存在)。

CartItem

这很好,可以添加新的addToCart: async (_, { id }, ctx) => { // 1. make sure they are signed in const { userId } = ctx.req; if (!userId) { throw new Error('You must be signed in!'); } // 2. query the users current cart const existingCartItem = await CartItem.findOne({ user: userId, item: id }); // 3. check if that item is already in their cart and if it is increment by 1 if (existingCartItem) {; return CartItem.findOneAndUpdate({ _id: existingCartItem.id, }, { $set: { quantity: existingCartItem.quantity + 1 } }); } // 4. if its not, create a fresh CartItem for that user return CartItem({ user: userId, item: id }).save(); } 并更新数量(如果已经存在)。但是CartItem的{​​{1}}字段未与cart的{​​{1}}更新。因此,我在解析器中添加了另一行以更新User并将id推入CartItem数组中。

User

执行此操作时,服务器开始冻结,并且所有API调用都停止运行,并且基本上中断了应用程序,没有错误,我可以看到。如果我删除了用于更新cartItem.id API的代码,则该调用将再次起作用,但返回到cart不会被更新。我想念什么吗?

userSchema看起来像这样:

addToCart: async (_, { id }, ctx) => {
  // 1. make sure they are signed in
  const { userId } = ctx.req;

  if (!userId) {
    throw new Error('You must be signed in!');
  }
  // 2. query the users current cart
  const existingCartItem = await CartItem.findOne({
    user: userId,
    item: id
  });

  // 3. check if that item is already in their cart and if it is increment by 1
  if (existingCartItem) {
    return CartItem.findOneAndUpdate({
      _id: existingCartItem.id,
    }, {
      $set: {
        quantity: existingCartItem.quantity + 1
      }
    });
  }
  // 4. if its not, create a fresh CartItem for that user
  const cartItem = await CartItem({ user: userId, item: id }).save();

  //EXTRA: push cartItem id to User cart array
  await User.findOneAndUpdate({
    "_id": userId
  }, {
    $push: {
      cart: cartItem.id
    }
  });

  return cartItem
}

我的CartItem模式如下:

User.cart

0 个答案:

没有答案