Javascript 然后插入子文档
我有一个order对象,其中包含一个order项数组。其中一些项目可能尚未创建,因此我希望将项目插入,然后将所有项目添加到订单中。下面是我试图在GraphQL解析器中执行的操作,但我无法将Javascript 然后插入子文档,javascript,node.js,mongodb,mongoose,graphql,Javascript,Node.js,Mongodb,Mongoose,Graphql,我有一个order对象,其中包含一个order项数组。其中一些项目可能尚未创建,因此我希望将项目插入,然后将所有项目添加到订单中。下面是我试图在GraphQL解析器中执行的操作,但我无法将然后链接到映射 updateOrder: async (_, { order: { id, items, ...order } }, { req }) => { const updatedOrder = items .map(async ({ id, ...item
然后
链接到映射
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 with 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 }
)
直到今天,不要读单词
upsert
。真奇怪,答应我,谢谢!对于那些正在执行类似操作的人,我忘记了从映射返回:const updateItems=await Promise.all(items.map(async({id,…item})=>{return await OrderItem.findByIdAndUpdate(id,{…item},{new:true,upsert:true,setDefaultsOnInsert:true};}));谢谢你的评论。已更新回答以从地图返回承诺。