问题描述
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,})
)
)