J'ai le modèle de base de données suivant :
- Chaque
Mediablock
contient une référence exactement à un objetUTS
et un objetMedia
.
- Chaque objet
UTS
contientrawText
etnormalisedText
- Chaque objet
Media
contient une URL et un horodatage
Mon fichier schema.prisma
ressemble à ceci :
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?
}
Mes résolveurs
ressemblent à ceci :
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
// Ce résolveur récupère des mediabooks du tableau "mediabooks" ci-dessus.
module.exports = {
Query: {
allMediablocks: () => prisma.mediablock.findMany(),
allMedia: () => prisma.media.findMany(),
allUTS: () => prisma.uts.findMany(),
},
};
Et mes typedefs
ressemblent à ceci :
module.exports = `
type Mediablock {
id: ID!
uts: UTS
media: Media # peut être nul lorsque le texte est généré en premier
}
type UTS {
id: ID!
rawText: String!
normalisedText: String!
}
type Media {
id: ID!
url: String!
createdAt: String!
}
# Le type "Query" est spécial : il répertorie toutes les requêtes disponibles que
# les clients peuvent exécuter, avec le type de retour pour chacune. Dans ce
# cas, la requête "allMediablocks" renvoie un tableau de zéro ou plusieurs Mediablocks (défini ci-dessus).
type Query {
allMediablocks: [Mediablock]
allMedia: [Media]
allUTS: [UTS]
}
`;
Mon fichier seed ressemble à ceci :
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);
});
Mon problème est que lorsque j'essaie de récupérer allMediablocks
, je ne peux pas obtenir les données UTS
ou Media
.
query allMediaBlocks {
allMediablocks {
uts {
normalisedText
}
media {
url
}
}
}
// réponse
{
"data": {
"allMediablocks": [
{
"uts": null,
"media": null
}
]
}
}
Je reçois simplement des valeurs null
pour les deux, alors qu'en réalité, la base de données (MongoDB) contient des références à ces deux objets dans d'autres tables.
Qu'est-ce que je fais de travers ? Mes résolveurs sont-ils incorrects ? Est-ce que mon schéma est structuré incorrectement pour MongoDB ?