在Experss.js + Mongodb上对对象进行排序的最佳实践

时间:2018-12-26 07:09:52

标签: javascript node.js mongodb express

我想问一下您对在expressjs + mongodb(mongoose)Web应用程序上对对象进行排序的最佳实践的想法。

假设我的产品模型具有四个属性:

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"
});

在产品列表页面上,我要实现以下排序功能:

  1. 最新类别(具有 salefrom 最近的商品会更高)
  2. 最便宜的分类(价格 越少的产品价格越高)
  3. 颜色变化排序(具有许多颜色的产品会变高)

我认为有几种方法可以实现它。您认为最佳做法是什么?

解决方案A. mongoose.find()。sort()+ mongoose.aggregate()

首先,我尝试了此解决方案。

对于最新排序最便宜的排序,mongoose.find()。sort()非常易于使用,且编码较少。

但是,mongoose.sort()不能完成颜色变化排序(因为它不能按array.length进行排序),所以我不得不使用另一种方法:mongoose.aggregate()

解决方案B. Server(Express.js)端的Array.prototype.sort()

接下来,我尝试了此解决方案。

首先使用mongoose.find()获取产品数组,然后使用compare()使用Array.prototype.sort()函数对产品进行排序,例如:

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是服务器端和客户端的一种语言,因此我认为这是排序的选项。

问题

从性能,灵活性和可维护性的角度来看,您认为哪种解决方案是最好的?

请分享我的想法。

1 个答案:

答案 0 :(得分:0)

由于您要提出意见。.试图分享我在此类应用程序中的经验。 :)

  1. 我将对要进行搜索或排序的字段保留在mongodb中的索引。例如,在我的数据库中,我有关于时间戳的索引(纪元时间,数字)。这有助于我使用.sort()对值进行排序,并且效果很好。
  2. 有些地方我不使用mongo的.sort(),但是我使用Javascript对结果进行排序。这有两点-Array.prototype.sort()或其他方法可以提供帮助。

    a。您将数据带到浏览器并排序/或执行其他操作。简而言之,请使用客户端(浏览器)资源。这是

    b。您无法将数据带到客户端,并且需要在进行一些过滤后仅显示其中的一部分。但是排序/其他操作需要完整的数据。在这种情况下,您可以将排序/其他操作保留在NodeJS代码内,并将结果仅带到客户端。

a点可帮助您利用客户端资源。我会尽可能使用它。