首页 > 解决方案 > 然后插入子文档

问题描述

我有一个带有一系列订单项的订单对象。其中一些项目可能尚未创建,因此我想更新这些项目,然后将所有项目添加到订单中。以下是我在 GraphQL 解析器中尝试执行的操作,但无法链接thenmap.

updateOrder: async (_, { order: { id, items, ...order } }, { req }) => {


        const updatedOrder = items
          .map(async ({ id, ...item }) => {
            await OrderItem.findByIdAndUpdate(
              id,
              { ...item },
              { new: true, upsert: true, setDefaultsOnInsert: true }
            );
          })
          .then(
            async (res) =>
              await Order.findByIdAndUpdate(
                id,
                { items: res, ...order },
                { new: true }
              )
          );

        return updatedOrder;
}

如果单独使用,地图的结果不会解析。

const updatedItems = items
          .map(async ({ id, ...item }) => {
            await OrderItem.findByIdAndUpdate(
              id,
              { ...item },
              { new: true, upsert: true, setDefaultsOnInsert: true }
            );
          })

const updatedOrder = await Order.findByIdAndUpdate(
                id,
                { items: updatedItems, ...order },
                { new: true }
              )
          );

我认为 bulkWrite 是我需要的,但我不知道如何从 bulkWrite 返回文档而不是修改文档的计数。如果没有新的/更新的文档,我不知道如何将它们推送到订单中。

标签: javascriptnode.jsmongodbmongoosegraphql

解决方案


您可以使用 .map 和 Promise.all 等到所有 upsert 完成,然后最后更新订单。第二个代码块可以更新为如下所示:

const updatedItems = await Promise.all(
  items.map(async ({ id, ...item }) => {
    return OrderItem.findByIdAndUpdate(
      id,
      { ...item },
      { new: true, upsert: true, setDefaultsOnInsert: true }
    );
  })
);

const updatedOrder = await Order.findByIdAndUpdate(
  id,
  { items: updatedItems, ...order },
  { new: true }
)

推荐阅读