映射集合以更新插入到数据库中。如何批量更新?

Map over collection to upsert into the database. How to batch upsert?

说,我有一个来自前端的数据结构如下:

const userData = [
  {
    id: 11223,
    bb: [
      {
        id: 12,
      },
      {
        id: 34,
        bbb: "bbb",
      },
    ],
  },
  {
    id:4234,
    ...
  },
];

因为,none/一些/所有数据可能已经在数据库中,这是我想出的:

const collection = [];
for (let i = 0; i < userData.length; i++) {
  const cur = userData[i];
  const subCur = cur.bb;
  const updatedCur = await db.cur.upsert({
      where: {
        id : cur.id
      },
      update: {
        ...
      },
      create: {
        ...
      },
    })
  );
  collection.push(updatedCur);
  for (let j = 0; j < subCur.length; j++) {
    const latest = subCur[j];
    await db.subcur.upsert({
      where: {
        id : latest.id
      },
      update: {
        ...
      },
      create: {
        ...
      },
    });
  }
}

总而言之,我正在逐一映射 userData 和 upsert 每个对象。在循环中,我映射了子集合并 upsert 它们在数据库中。

我担心的是,我正在以这种方式向 Db 中输入大量条目。这是最好的方法吗?

旁白: 我以前尝试在 upsert 中执行多个 inserts,但是,据我所知,我被 update 部分卡住了,我们无法在 update 中插入多个记录嵌套在 upsert 中。这是正确的吗?

更新:

根据 Ryan 的要求,架构如下所示:

model Cur {
  id      Int,
  subCur  SubCur[]
  ...
}

model SubCur {
  id      Int,
  cur     Cur  @relation(fields: [curId], references : [id])
  curId   Int
  ...
}

总而言之,有很多像'SubCur'这样的模型与'Cur'模型有1-n关系。作为 'UserData' 有效载荷,可能有一些新数据,一些是对 Db 中现有数据的更新,我很好奇,将 upsert 数据放入数据库的最佳方法是什么。具体来说,我是否必须一次插入一个?

我假设你的架构是这样的:

model Cur {
  id Int @id
}

model Subcur {
  id  Int     @id
  bbb String?
}

这是一个更好的版本:

const collection = await prisma.$transaction(
    userData.map(cur =>
      prisma.cur.upsert({
        where: { id: cur.id },
        update: {},
        create: { id: cur.id },
      })
    )
  )

  await prisma.$transaction(
    userData
      .flatMap(cur => cur.bb)
      .map(latest =>
        prisma.subcur.upsert({
          where: {
            id: latest.id,
          },
          update: {
            bbb: latest.bbb,
          },
          create: {
            id: latest.id,
            bbb: latest.bbb,
          },
        })
      )
  )