最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何通过 prisma 正确播种具有两个多对多自关系的 mongoDb 集合

网站源码admin34浏览0评论

如何通过 prisma 正确播种具有两个多对多自关系的 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 关键字,这也非常乏味。

回答如下:

我建议使用两步流程导入数据。

  1. 您创建

    ChapterSegment
    文档,然后使用更新方法建立它们之间的关系。这将使过程不那么复杂并且更易于维护。下面是一个使用 Prisma 客户端的例子:

    假设您有数组中 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,
      },
    });
  })
);
  1. 现在您已经创建了
    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
文档,然后分别更新关系。这应该更易于管理和维护。

发布评论

评论列表(0)

  1. 暂无评论