正确播种具有两个多对多自关系的 mongoDb 集合"/>
如何通过 prisma 正确播种具有两个多对多自关系的 mongoDb 集合
我在 mongoDb 中有一个集合,有两个多对多的自关系。这个想法是每个文档可以有 0 到许多后继者和 0 到许多前任者。该集合是使用以下模式通过 Prisma 生成的:
model ChapterSegment {
id String @id @default(auto()) @map("_id") @db.ObjectId
chapter Chapter @relation(fields: [chapterId], references: [id])
chapterId String @db.ObjectId
successorIds String[] @db.ObjectId
predecessorIds String[] @db.ObjectId
successors ChapterSegment[] @relation("successors-predecessors", fields: [successorIds], references: [id])
predecessors ChapterSegment[] @relation("successors-predecessors", fields: [predecessorIds], references: [id])
}
我似乎不明白的是如何使用 typescript 中的 prisma 客户端 将数据导入该模型。
我尝试过使用嵌套创建,但由于其递归性质,这很快就会变得复杂。它适用于一些记录,但不可能维护大量数据。
我也尝试过使用简单的创建,将结果存储在打字稿变量中并在内存中连接它们并通过 prisma connect 关键字,这也非常乏味。
回答如下:我建议使用两步流程导入数据。
您创建
文档,然后使用更新方法建立它们之间的关系。这将使过程不那么复杂并且更易于维护。下面是一个使用 Prisma 客户端的例子:ChapterSegment
假设您有数组中 ChapterSegment 文档的数据,首先创建没有关系的文档:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const chapterSegmentsData = [
// Your data here in the format
// { chapterId: '...', successors: [...], predecessors: [...] }
];
// Create ChapterSegment documents without relationships
const createdChapterSegments = await Promise.all(
chapterSegmentsData.map(async (data) => {
const { chapterId, successors, predecessors, ...rest } = data;
return prisma.chapterSegment.create({
data: {
chapterId,
...rest,
},
});
})
);
- 现在您已经创建了
文档,您可以使用更新方法建立它们之间的关系:ChapterSegment
// Helper function to find a ChapterSegment's id by its original data
const findIdByData = (data) => {
const found = createdChapterSegments.find(
(created) => created.chapterId === data.chapterId
);
return found ? found.id : null;
};
// Update relationships
await Promise.all(
chapterSegmentsData.map(async (data) => {
const id = findIdByData(data);
if (!id) return;
const successorIds = data.successors.map(findIdByData).filter((id) => id);
const predecessorIds = data.predecessors
.map(findIdByData)
.filter((id) => id);
await prisma.chapterSegment.update({
where: { id },
data: {
successorIds: { set: successorIds },
predecessorIds: { set: predecessorIds },
},
});
})
);
使用这种方法,您首先创建
ChapterSegment
文档,然后分别更新关系。这应该更易于管理和维护。
更多推荐
如何通过 prisma 正确播种具有两个多对多自关系的 mongoDb 集合
发布评论