【问题标题】:Upsert subdocuments then然后插入子文档
【发布时间】:2021-05-11 21:35:56
【问题描述】:

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

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 返回文档而不是修改文档的计数。如果没有新的/更新的文档,我不知道如何将它们推送到订单中。

【问题讨论】:

  • 直到今天才读到upsert这个词。多么奇怪。
  • promise.all,使用搜索

标签: javascript node.js mongodb mongoose graphql


【解决方案1】:

您可以将 .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 }
)

【讨论】:

  • 谢谢!对于那些正在做类似事情的人,我忘记从地图返回: const updatedItems = await Promise.all( items.map(async ({ id, ...item }) => { return await OrderItem.findByIdAndUpdate( id, { ...item }, { new: true, upsert: true, setDefaultsOnInsert: true } ); }) );
  • 感谢您的评论。更新了从地图返回承诺的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2015-07-22
  • 2016-12-14
  • 2021-03-08
  • 2016-04-14
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多