【问题标题】:Best Practice to Sort Objects on Experss.js + MongodbExpress.js + Mongodb 中对象排序的最佳实践
【发布时间】: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"
});

在产品列表页面,我想实现如下排序功能:

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

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

解决方案 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


    【解决方案1】:

    既然您征求意见.. 只是想分享我对此类应用程序的经验。 :)

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

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

      b.您不能将数据带到客户端,并且需要在经过一些过滤后仅显示其中的一部分。但是排序/其他操作需要完整的数据。如果是这种情况,您将排序/其他操作保留在 NodeJS 代码中,并且只将结果发送到客户端。

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

    【讨论】:

    • 感谢您分享您的经验!在这种情况下,我的产品页面显示了大部分产品数据,因此我将尝试您的 Point a 方式。另外,我没有为我的 ProductSchema 设置索引,尽管我知道实现良好的性能非常重要,再次感谢您的回答:)
    • 当然,请告诉我们进展如何:)
    • 抱歉,我对如何将我的产品数据提供给 html 感到困惑:我说 我的产品页面显示了大部分产品数据,但实际上是 product.salefrom 不显示在浏览器上。在这种情况下,如果我仍然想在客户端进行排序,我需要做的就是将 salesfrom 数据隐藏到 html 中。我说的对吗?
    • 您向浏览器(html、js 等)带来的任何数据都不会被隐藏。所以在这种情况下,你需要在 nodejs 代码中在后端执行操作。
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2011-12-27
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多