映射集合以向上插入数据库如何批量上传?

问题描述

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

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

因为,没有/一些/所有数据可能已经存在于数据库中,所以我想出了以下内容

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
      },});
  }
}

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

我担心的是,我以这种方式向Db进行了大量输入。这是最好的方法吗?

除了: 以前,我曾尝试在inserts内进行多个upsert,但是据我所知,我陷入了update部分,我们无法在update内插入多个记录嵌套在upsert中。这是正确的吗?

更新:

根据Ryan的要求,该模式如下所示:

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

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

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

解决方法

我认为您的架构是这样的:

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,})
      )
  )