将集合映射到 upsert 到数据库中。如何批量更新插入?
Posted
技术标签:
【中文标题】将集合映射到 upsert 到数据库中。如何批量更新插入?【英文标题】:Map over collection to upsert into the database. How to batch upsert? 【发布时间】:2021-02-02 05:36:24 【问题描述】:说,我有一个从前端进来的数据结构如下:
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
映射到数据库中。
我担心我会以这种方式在 Db 中输入很多条目。这是最好的方法吗?
另外:
我之前尝试在upsert
中执行多个inserts
,但是,据我所知,我被update
部分卡住了,我们无法在update
中插入多个记录,嵌套在upsert
中。这是正确的吗?
更新:
按照 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
数据放入数据库的最佳方法是什么。具体来说,我是否必须一次插入一个?
【问题讨论】:
【参考方案1】:我假设您的架构是这样的:
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,
,
)
)
)
【讨论】:
以上是关于将集合映射到 upsert 到数据库中。如何批量更新插入?的主要内容,如果未能解决你的问题,请参考以下文章
谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert