javascript - Mongoose-如何进行自定义排序?
问题描述
我有这个模型,我想做一个排序,请求按这个顺序排序(estadoPedido:Pendente,estadoPedido:Agendado,EstadoPedido:Concluido) 这可能吗?
var requestSchema = new Schema({
paciente: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: [true, "paciente is a required field"],
},
encaminhado: {
type: Boolean,
required: [true, "encaminhado is a required field"],
}, //vem do body
pessoaRisco: {
type: Boolean,
required: [true, "pessoaRisco is a required field"],
}, //vem do body
trabalhoRisco: {
type: Boolean,
required: [true, "trabalhoRisco is a required field"],
}, //vem do body
estadoPedido: {
type: String,
enum: ["Pendente", "Agendado", "Concluído", "Aguarda Resultado"],
},
resultado: { type: String, enum: ["Positivo", "Negativo"] },
dataExame: {
type: Date,
},
prioridade: { type: Number },
});
解决方案
但是目前的解决方案是使用聚合管道,这种方法无法使用索引进行优化,并且需要完整的集合扫描来转换每个文档。
我想建议一种替代解决方法,它可能特别适用于猫鼬。但它确实需要数据迁移,但如果您仍处于早期开发阶段,这是可能的。
您可以做的是修改您的架构estadoPedido
:
estadoPedido: {
type: String,
enum: ["1_Pendente", "2_Agendado", "3_Concluído", "4_Aguarda", "5_Resultado"] // or use any other sortable prefix and separator symbol
index: true,
get(estadoPedido) {
const [, value] = estadoPedido.split('_') // this assumes you don't originally have _ in your enum
// or put your own logic to get your original value back
return value
}
}
然后当你想查询时,你可以这样做
Request.find().sort({ estadoPedido: 1 })
mongoose 将执行 get 函数并estadoPedido
在每个文档上转换为原始值。
警告
请记住,使用此解决方案,您只能在 mongoose 文档中获得原始值,当您在其他地方使用它时,例如在聚合中,您将不得不使用前缀值
推荐阅读
- mongodb - 如果满足条件,MongoDB 会附加 `$or` 运算符
- java - 将模拟 bean 注入 AnnotatinConfigApplicationContext 失败
- javascript - 在 Servlet 中读取 JSON 值的问题
- mongodb - Mongodb 集合复制和读取游标
- html - 此代码正在覆盖我的主题容器空间 (style.css?
- java - Spring JPA Update and Return the Updated Data
- python - Python 请求 - 下载 SVG 图像以及标签中引用的 PNG
- django - 登录或注册后,Django Rest Framework 将返回用户配置文件以及 api 令牌
- python - 使用带有fuzzywuzzy的生成器表达式来获得前2个匹配项
- python - 为依赖于 python argparse 中另一个可选参数的可选参数设置默认值