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

编程入门 行业动态 更新时间:2024-10-06 10:27:11

如何通过 prisma <a href=https://www.elefans.com/category/jswz/34/1771142.html style=正确播种具有两个多对多自关系的 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
文档,然后分别更新关系。这应该更易于管理和维护。

更多推荐

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

本文发布于:2024-05-30 10:16:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1770387.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:正确   两个   关系   prisma   mongoDb

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!