【问题标题】:Nodejs Mongoose - One databse call = two separate arrays sorted by different criteriaNodejs Mongoose - 一个数据库调用 = 按不同标准排序的两个独立数组
【发布时间】:2019-07-13 07:17:20
【问题描述】:

我正在使用 Nodejs(express) + MongoDB,并想问是否有一种方法可以访问数据库以获取一组文档(为简单起见,假设博客文章具有喜欢计数和浏览计数属性),对结果进行排序首先通过喜欢计数将其存储在array1中,然后无需再次调用数据库,按视图计数对其进行排序并将其存储在array2中,因此结果将是:

  • 1 个数据库访问权限
  • array1:按赞数排序的博文
  • array2:按浏览次数排序的博文

所以基本上我不想链接排序查询,但我希望输出是 2 个数组,每个数组按不同的标准排序。非常感谢。

【问题讨论】:

  • 你的问题是什么?
  • 可能我的做法是完全错误的(我不是那么有经验),但是如果每次数据库访问都消耗服务器资源,那么我认为最好搜索一次文档然后制作两个数组,每个数组按不同的排序标准与调用数据库两次,然后在第一次调用中按视图排序文档,第二次调用按喜欢排序,还是我错了?
  • 直接从查询中获取排序后的数组array1,然后您可以使用developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 从array1 创建array2。问题出在哪里?
  • 我也是这么想的,但正如 mozilla 所说,.sort() 的速度和空间复杂度无法得到保证,所以我想的是 MongoDB 排序算法会比 javascript .sort 更快()。

标签: node.js database mongodb express mongoose


【解决方案1】:

您可以使用 $facet 进行聚合,如下所示:

db.blog.aggregate([
   {
      $facet: {
        sortByLikeCounts: [ { $sort: { likeCounts: -1 }} ],      // likeCounts is field name which is used to save total counts of like 
        sortByViewCounts: [ { $sort: { viewCounts: -1 }} ]       // viewCounts is field name which is used to save total counts of view
      }
   }
])

结果你会得到两个按不同查询排序的独立数组。

【讨论】:

  • 我在 Mongo shell 中尝试过,它确实有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多