【发布时间】:2019-05-24 12:21:07
【问题描述】:
我想询问您对在 expressjs + mongodb(mongoose) 网络应用程序上对对象进行排序的最佳实践的看法。
假设我的 Product 模型有四个属性:
var ProductSchema = new mongoose.Schema({
name: String, // "Summer T-shirt"
price: Number, // 100
salefrom: Date, // ISODate("2018-12-25T10:15:25.338Z")
colors: [String] // "red", "blue", "black"
});
在产品列表页面,我想实现如下排序功能:
- 最新排序(最近salefrom 的产品会更高)
- 最便宜的排序(价格越少的产品会越高)
- 颜色变化排序(具有许多颜色的产品会变得更高)
我认为有几种方法可以实现它。您认为最佳做法是什么?
解决方案 A. mongoose.find().sort() + mongoose.aggregate()
首先我尝试了这个解决方案。
对于最新的排序和最便宜的排序,mongoose.find().sort() 使用起来非常简单,代码更少。
但是 颜色变化排序 不能通过 mongoose.sort() 完成(因为它不能按 array.length 排序),所以我必须使用另一种方法:mongoose.aggregate() .
解决方案 B. Array.prototype.sort() 在 Server(Express.js) 端
接下来我尝试了这个解决方案。
首先使用 mongoose.find() 获取产品数组,然后使用 Array.prototype.sort() 函数使用 compare() 对产品进行排序,例如:
function compare(a,b) {
if (a.colors.length < b.colors.length)
return -1;
if (a.colors.length > b.colors.length)
return 1;
return 0;
}
我认为这个解决方案非常灵活,我可以制作更复杂的排序功能,这是我用 mongodb(mongoose) 内置方法做不到的。
但是,与解决方案 A 相比,使用此解决方案我必须编写很多代码。
解决方案 C. Array.prototype.sort() 在客户端(浏览器)端
老实说我没有尝试过这个解决方案,但是由于 javascript 是服务器端和客户端的语言,我认为这是排序的选项。
问题
从性能、灵活性和可维护性的角度来看,您认为哪种解决方案最好?
请分享你的想法。
【问题讨论】:
标签: javascript node.js mongodb express