我有以下数据库模型:

  • 每个Mediablock恰好包含对一个UTS对象和一个Media对象的引用.

enter image description here

  • 每个UTS个对象包含rawTextnormalisedText

enter image description here

  • 每个Media对象包含一个url和一个时间戳

enter image description here

我的schema.prisma看起来是这样的:

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Mediablock {
  id      String @id @default(auto()) @map("_id") @db.ObjectId // gen a new, unique id
  UTS     UTS    @relation(fields: [utsId], references: [id])
  utsId   String @unique @map("uts_id") @db.ObjectId
  Media   Media  @relation(fields: [mediaId], references: [id])
  mediaId String @unique @map("media_id") @db.ObjectId
}

model UTS {
  id             String      @id @default(auto()) @map("_id") @db.ObjectId
  rawText        String
  normalisedText String
  createdAt      DateTime    @default(now())
  Mediablock     Mediablock?
}

// // Mediablocks contain a Video object and connect back to the Mediablock.
// // mediablockId must have @db.ObjectId to match up with Mediablock's id type
model Media {
  id         String      @id @default(auto()) @map("_id") @db.ObjectId
  url        String
  createdAt  DateTime    @default(now())
  Mediablock Mediablock?
}

我的resolvers看起来是这样的:

const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

//This resolver retrieves mediabooks from the "mediabooks" array above.
module.exports = {
  Query: {
    allMediablocks: () => prisma.mediablock.findMany(),
    allMedia: () => prisma.media.findMany(),
    allUTS: () => prisma.uts.findMany(),
  },
};

我的typedefs看起来是这样的:

module.exports = `
  type Mediablock {
    id: ID!
    uts: UTS
    media: Media # can be null when the text is generated first
  }

  type UTS {
    id: ID!
    rawText: String!
    normalisedText: String!
  }

  type Media {
    id: ID!
    url: String!
    createdAt: String!
  }

  # The "Query" type is special: it lists all of the available queries that
  # clients can execute, along with the return type for each. In this
  # case, the "allMediablocks" query returns an array of zero or more Mediablocks (defined above).
  type Query {
    allMediablocks: [Mediablock]
    allMedia: [Media]
    allUTS: [UTS]
  }
`;

我的种子文件如下所示:

const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

const mediaData = [
  {
    UTS: {
      create: {
        rawText: 'Welcome',
        normalisedText: 'welcome',
      },
    },
    Media: {
      create: {
        url: 'https://www.youtube.com/watch?v=kq9aShH2Kg4',
        createdAt: '2022-09-29T12:00:00.000Z',
      }
    }
  }
];

async function main() {
  console.log(`Started seeding ...`);

  for (const d of mediaData) {

    const mediablock = await prisma.Mediablock.create({
      data: d,
    });

    console.log(`Created Mediablock with id: ${mediablock.id}`);

  }

  console.log(`\nSeeding complete.`);
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

我的问题是,当我试图查询allMediablocks时,我无法获得UTSMedia数据中的任何数据.

enter image description here

query allMediaBlocks {
  allMediablocks {
    uts {
      normalisedText
    }
    media {
      url
    }
  }
}
// response
{
  "data": {
    "allMediablocks": [
      {
        "uts": null,
        "media": null
      }
    ]
  }
}

我只得到了null个值,而实际上,数据库(MongoDB)包含对其他表中这两个对象的引用.

enter image description here

我做错了什么?我的解析程序是不是不正确? 我的模式 struct 是否不适合MongoDB?

推荐答案

我已经把我的schema.prisma改成了:

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Mediablock {
  id      String @id @default(auto()) @map("_id") @db.ObjectId // gen a new, unique id
  utsId   String @unique @map("uts_id") @db.ObjectId
  uts     UTS    @relation(fields: [utsId], references: [id])
  mediaId String @unique @map("media_id") @db.ObjectId
  media   Media  @relation(fields: [mediaId], references: [id])
}

model UTS {
  id             String      @id @default(auto()) @map("_id") @db.ObjectId
  rawText        String
  normalisedText String
  createdAt      DateTime    @default(now())
  mediablock     Mediablock?
}

// // Mediablocks contain a Video object and connect back to the Mediablock.
// // mediablockId must have @db.ObjectId to match up with Mediablock's id type
model Media {
  id         String      @id @default(auto()) @map("_id") @db.ObjectId
  url        String
  createdAt  DateTime    @default(now())
  mediablock Mediablock?
}

我的resolver个目标是:

const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

//This resolver retrieves mediabooks from the "mediabooks" array above.
module.exports = {
  Query: {
    allMediablocks: () => prisma.mediablock.findMany({
      include: {
        media: true,
        uts: true
      }
    }),
    allMedia: () => prisma.media.findMany(),
    allUTS: () => prisma.uts.findMany(),
  },
};

我的typedefs个目标是:

module.exports = `
  type Mediablock {
    id: ID!
    uts: UTS
    media: Media # can be null when the text is generated first
  }

  type UTS {
    id: ID!
    rawText: String!
    normalisedText: String!
  }

  type Media {
    id: ID!
    url: String!
    createdAt: String!
  }

  # The "Query" type is special: it lists all of the available queries that
  # clients can execute, along with the return type for each. In this
  # case, the "allMediablocks" query returns an array of zero or more Mediablocks (defined above).
  type Query {
    allMediablocks: [Mediablock]
    allMedia: [Media]
    allUTS: [UTS]
  }
`;

我还改变了我的seed函数的工作方式:


const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient();

const mediaData = [
  {
    uts: {
      create: {
        rawText: 'Welcome',
        normalisedText: 'welcome',
        createdAt: '2022-09-29T12:00:00.000Z',
      },
    },
    media: {
      create: {
        url: 'https://www.youtube.com/watch?v=kq9aShH2Kg4',
        createdAt: '2022-09-29T12:00:00.000Z',
      }
    }
  }
];

async function main() {
  console.log(`Started seeding ...`);

  for (const d of mediaData) {

    const mediablock = await prisma.Mediablock.create({
      data: d,
    });

    console.log(mediablock);

  }

  console.log(`\nSeeding complete.`);
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

现在,使用相同的GraphQL查询:

query allMediaBlocks {
  allMediablocks {
    uts {
      normalisedText
    }
    media {
      url
    }
  }
}

我得到了以下(所需的)响应:

{
  "data": {
    "allMediablocks": [
      {
        "uts": {
          "normalisedText": "welcome"
        },
        "media": {
          "url": "https://www.youtube.com/watch?v=kq9aShH2Kg4"
        }
      }
    ]
  }
}

Mongodb相关问答推荐

如何在MongoDB中通过限制和跳过查找项进行匹配

在服务器上部署后端时判断??=默认判断

Mongo:查找具有 0 个关联文档的文档,成本更低

MongoDB - 使用许多嵌套对象更新嵌套数组

对 MongoDB 集合中的对象数组进行排序

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

mongo.lock 文件有什么用?

node.js & express - 应用程序 struct 的全局模块和最佳实践

更新 MongoDB 中嵌套实体数组中的属性

在 Heroku 上使用 Node 读取、写入和存储 JSON

使用 MongoDB C# 驱动程序在嵌套数组上使用过滤器生成器进行查询

如何使用sailsjs v0.10连接mongodb?

从性能Angular 来看 MongoDB 嵌入式与参考

为什么使用 Redis 而不是 MongoDb 进行缓存?

在 MongoDB 中插入或更新许多文档

在安装的 MongoDB homebrew 中设置 dbpath (Mac OS)

Mongoose - 获取 _id 列表而不是具有 _id 的对象数组

MongoDB 查询:字段不存在或具有特定值

MongoDB 和 Robomongo: Can't connect (authentication)

Mongodb同时在多个字段上聚合(计数)