我希望Float value
对查询结果进行排序。但是存储在mongodb中的值是String
类型,我可以将String
解析为Float
并对其进行动态排序吗?就像复杂的排序一样。
以下是我的架构和排序代码的一部分:
架构:
var ScenicSpotSchema = new Schema({
...
detail_info: {
...
overall_rating: String,
...
},
});
排序功能:
ScenicSpot.find({'name': new RegExp(req.query.keyword)}, )
.sort('-detail_info.overall_rating')
.skip(pageSize * pageNumber)
.limit(pageSize)
.exec(function (err, scenicSpots) {
if (err) {
callback(err);
} else {
callback(null, scenicSpots);
}
});
感谢任何形式的帮助和建议。 :)
答案 0 :(得分:0)
.sort
mongoose不支持转换数据类型。见:http://mongoosejs.com/docs/api.html#query_Query-sort
它只接受列名和订单。
实现目标有两条途径:
但两者都是可怕而丑陋的
如果您想对String列进行排序,但将其解析为Float。此操作将扫描该集合中的所有数据,并且不能使用索引。这是非常缓慢的行动。
所以我认为最快和最正确的操作是在你的mongodb数据库中将String列转换为Float。然后你可以使用普通.sort('-detail_info.overall_rating')
来完成任务。
答案 1 :(得分:0)
排序后的用户排序规则将正确地对字符串浮点数进行升序和降序排序。
cenicSpot.find({'name': new RegExp(req.query.keyword)}, )
.sort('-detail_info.overall_rating')
.collation({ locale: "en-US", numericOrdering: true })
.skip(pageSize * pageNumber)
.limit(pageSize)
.exec(function (err, scenicSpots) {
if (err) {
callback(err);
} else {
callback(null, scenicSpots);
}
});