3

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

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
      },
      update: {
        ...
      },
      create: {
        ...
      },
    });
  }
}

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

我担心的是我以这种方式在数据库中输入了很多条目。这是最好的方法吗?

旁白:我之前曾尝试inserts在. 这个对吗?upsertupdateupdateupsert

更新:

按照 Ryan 的要求,Schema 如下所示:

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

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

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

4

1 回答 1

2

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

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,
          },
        })
      )
  )
于 2020-10-19T13:30:45.770 回答