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)
谢谢你!
虽然 Prisma V2.19 引入了按关系聚合值排序,但截至撰写本文时,唯一支持的聚合属性是count。据我所知,目前 Prisma 并未直接支持您所要求的内容。min如果他们添加并max聚合属性以进行排序,这是可能的。
一种可能的解决方法是在检索后对 Node.js 内的消息进行排序。我添加了一个解决方案,该解决方案使用orderByRelation预览功能来简化排序并确保对话中的消息始终按顺序排列(最新的在前)。
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 是单线程的。
| 归档时间: |
|
| 查看次数: |
19241 次 |
| 最近记录: |