prisma 按关系排序只有 _count 属性。无法按关系字段排序

E.B*_*kov 9 sql postgresql prisma prisma2

考虑以下 Prisma 架构:

model Conversation {
  id           Int                         @id @default(autoincrement())
  createdAt    DateTime                    @db.Timestamp(6)
  messages     ConversationMessage[]
}

model ConversationMessage {
  id             Int                     @id @default(autoincrement())
  text           String                  @db.VarChar(1000)
  sentAt         DateTime                @map("sent_at") @db.Timestamp(6)
  conversationId Int?                    @map("conversation_id")
  userId         Int?                    @map("user_id")
  conversation   Conversation?           @relation(fields: [conversationId], references: [id])
  sender         User?                   @relation(fields: [userId], references: [id])
}
Run Code Online (Sandbox Code Playgroud)

我想运行这样的查询,以便获得按消息日期排序的对话列表,即首先包含新消息的对话列表。

prisma.conversation.findMany({
    orderBy: {
        messages: {
            sentAt: 'desc'
        }
    },
    ...
})
Run Code Online (Sandbox Code Playgroud)

但我现在可以查询的唯一方法是这样的,即关系仅具有_count某种属性。

prisma.conversation.findMany({
    orderBy: {
        messages: {
           '_count': 'desc'
        }
     },
     ...
})
Run Code Online (Sandbox Code Playgroud)

环境与设置


    OS: Mac OS,
    Database: PostgreSQL
    Node.js version: v12.19.0

Run Code Online (Sandbox Code Playgroud)

棱镜版

prisma               : 2.24.1
@prisma/client       : 2.24.1
Current platform     : darwin
Query Engine         : query-engine 18095475d5ee64536e2f93995e48ad800737a9e4 (at node_modules/@prisma/engines/query-engine-darwin)
Migration Engine     : migration-engine-cli 18095475d5ee64536e2f93995e48ad800737a9e4 (at node_modules/@prisma/engines/migration-engine-darwin)
Introspection Engine : introspection-core 18095475d5ee64536e2f93995e48ad800737a9e4 (at node_modules/@prisma/engines/introspection-engine-darwin)
Format Binary        : prisma-fmt 18095475d5ee64536e2f93995e48ad800737a9e4 (at node_modules/@prisma/engines/prisma-fmt-darwin)
Default Engines Hash : 18095475d5ee64536e2f93995e48ad800737a9e4
Studio               : 0.397.0
Preview Features     : orderByRelation

Run Code Online (Sandbox Code Playgroud)

谢谢你!

Tas*_*mam 8

虽然 Prisma V2.19 引入了按关系聚合值排序,但截至撰写本文时,唯一支持的聚合属性是count。据我所知,目前 Prisma 并未直接支持您所要求的内容。min如果他们添加并max聚合属性以进行排序,这是可能的。

一种可能的解决方法是在检索后对 Node.js 内的消息进行排序。我添加了一个解决方案,该解决方案使用orderByRelation预览功能来简化排序并确保对话中的消息始终按顺序排列(最新的在前)。

更新 Prisma 客户端以使用orderByRelation预览功能。

一、更新schema.prisma添加预览功能

generator client {
  provider = "prisma-client-js"
  previewFeatures = ["orderByRelation"]
}
Run Code Online (Sandbox Code Playgroud)

现在更新 prisma 客户端

prisma generate client   
Run Code Online (Sandbox Code Playgroud)

获取conversations并按最新消息对它们进行排序

generator client {
  provider = "prisma-client-js"
  previewFeatures = ["orderByRelation"]
}
Run Code Online (Sandbox Code Playgroud)

unsortedConversations包含所有必需的对话,但它们是无序的。您可以通过创建自定义比较器函数按所需的顺序对其进行排序。

prisma generate client   
Run Code Online (Sandbox Code Playgroud)

Conversation但请注意,如果记录数量非常大,则应用程序端的排序可能会导致性能不佳,特别是考虑到 Node.js 是单线程的。

  • 遗憾的是,这仍然不受支持:( (2认同)