我正在尝试通过 mongoose 3.6.20 进行排序,但我收到了一些意想不到的结果。
我有一个有名字的公司列表。起初我以为它可能是以区分大小写的方式排序。根据文章,我希望是真的。
我现在使用虚拟属性来降低排序字段的大小写。但是,我仍然得到意想不到的结果。
CompanySchema.virtual('name_lower').get(function(){
return this.name.toLowerCase();
});
当我排序时
Company.find().sort({ name_lower: 1 });
我按以下顺序获取它:
- 公司名称
- 谷歌
- 公司名称(是的,用于测试的副本)
我也在输出我的虚拟财产的价值,它看起来是正确的。没有空格或时髦的字符会导致第二个“公司名称”出现在 google 之后。
使用 nodejs、express、mongoose。
我错过了什么或做错了什么?
更新:
根据答案中提供的信息,我重构了我的架构以包含一些规范化字段并连接到我的文档的预保存事件中,在此我更新这些规范化字段并在以后的所有查询中使用它们进行排序。
CompanySchema.pre('save', function(next){
this.normalized_name = this.name;
});
接下来,在我使用的架构中:
var CompanySchema = mongoose.Schema({
...
normalized_name: { type: String, set: normalize },
...
});
Wherenormalize
是一个函数,它现在返回传递给它的值的小写版本。但是,这允许我稍后非常快速地对其进行扩展,并且我可以快速对可能需要排序的其他字段执行相同的操作。