然后修改子文档



我有一个包含订单项数组的订单对象。其中一些项目可能还没有创建,所以我想要打乱项目,然后将所有项目添加到订单中。以下是我在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;
}

如果单独使用,map的结果将无法解析。

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

你可以在Promise中使用.map。所有的等待,直到所有的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 }
)

最新更新