Prisma.js MongoDB关联查询过滤器失效问题排查
问题:无法通过Prisma过滤器获取用户点赞的帖子
我定义了如下Post模型:
model Post { id String @id @default(auto()) @map("_id") @db.ObjectId createdAt DateTime @default(now()) updatedAt DateTime @updatedAt ... ... ... LikedPosts LikedPost[] }
以及LikedPost模型:
model LikedPost { id String @id @default(auto()) @map("_id") @db.ObjectId createdAt DateTime @default(now()) post Post @relation(fields: [postId], references: [id]) postId String user User @relation(fields: [userId], references: [id]) userId String @@unique([userId, postId]) }
我尝试在db.post.findMany中使用如下Prisma过滤器,获取某用户点赞的所有帖子:
where: { LikedPosts: { some: { userId: { equals: session.userId as string, }, }, }, },
但结果始终是空数组。即使替换session.userId为用户的固定ID值(如"62d6b8d220ba0fa6d5cea60f"),甚至在Prisma Studio中操作,依然无法得到正确结果。请问我哪里操作有误?
解决方法
检查ObjectID类型匹配:你的模型中
userId和postId定义为String但映射到MongoDB的ObjectId,若session.userId是字符串格式的ObjectID,Prisma查询时可能需要显式转换类型,可尝试用Prisma.ObjectId包装ID值:userId: { equals: Prisma.ObjectId(session.userId as string), }同时要确保数据库中存储的
userId确实是字符串格式的ObjectID,而非二进制类型。补全关联关系的双向配置:检查
User模型是否定义了与LikedPost的关联字段,完整的三方关联需要User模型添加对应字段:model User { id String @id @default(auto()) @map("_id") @db.ObjectId // 其他字段... likedPosts LikedPost[] }换用更直接的查询逻辑:直接从
LikedPost模型入手,关联查询对应的Post数据,这种方式更不易出错:const likedPosts = await db.likedPost.findMany({ where: { userId: session.userId as string }, include: { post: true }, }); // 提取目标Post列表 const posts = likedPosts.map(item => item.post);验证数据库原始数据:在MongoDB客户端中直接查询
LikedPost集合,确认存在userId和postId匹配的记录,且postId对应有效的Post文档ID。若数据库本身无关联数据,查询自然返回空数组。
内容的提问来源于stack exchange,提问作者Сергей Потиханов
相关产品推荐
相关产品推荐

