Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 然后插入子文档_Javascript_Node.js_Mongodb_Mongoose_Graphql - Fatal编程技术网

Javascript 然后插入子文档

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

我有一个order对象,其中包含一个order项数组。其中一些项目可能尚未创建,因此我希望将项目插入,然后将所有项目添加到订单中。下面是我试图在GraphQL解析器中执行的操作,但我无法将
然后
链接到
映射

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};}));谢谢你的评论。已更新回答以从地图返回承诺。