You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Сергей Потиханов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:19:47