映射集合以更新插入到数据库中。如何批量更新?
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,
},
})
)
)
说,我有一个来自前端的数据结构如下:
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,
},
})
)
)