javascript - 然后插入子文档
问题描述
我有一个带有一系列订单项的订单对象。其中一些项目可能尚未创建,因此我想更新这些项目,然后将所有项目添加到订单中。以下是我在 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 返回文档而不是修改文档的计数。如果没有新的/更新的文档,我不知道如何将它们推送到订单中。
解决方案
您可以使用 .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 }
)
推荐阅读
- c# - 如何根据某些条件返回不同的类对象?
- c# - 如何在用户输入控制台应用程序的任何文本之前显示多个文本行
- php - 获取数组中有值的值的个数
- ruby-on-rails - Rails activestorage 不会创建迁移文件
- pointers - Julia:如何获取指针指向的数组?
- linux - 模拟声卡 ALSA snd-dummy (Docker - Kernel Rebuild - ALSA snd-dummy)
- azure - 使用 Azure Graph API 将组添加为组的成员
- php - 我正在尝试在另一个 if 语句中使用 if 但我遇到了一些错误
- android - Android 应用程序构建失败,没有有用的日志
- search - 有没有办法将几个字符复制到文本板中的剪贴板?