繁体   English   中英

在 ZCCADCDEDB567ABAE643E15DCF0974E503Z 中,如何合并两种不同排序的结果,并预先指定总结果数?

[英]In Mongoose, how do you merge the results of two different sorts, with a pre-specified number of total results?

我有一个Jar集合,它的文档包含红色和蓝色弹珠。 如果我想在拥有大量红色弹珠的基础上获得前 5 Jars,我会这样做:

Jar.find({}).sort({red: "desc"}).limit(5).exec((err, results) => { ... });

但是,如果我想在拥有大量红色或蓝色弹珠且没有重复的基础上获得前 5 个 Jars 怎么办? 有没有办法以这种方式获取两种不同类型的结果?

举个例子,如果我有

[{red: 20, blue: 10}, {red: 10, blue: 3}, {red: 5, blue: 22}, {red: 10, blue: 10}]前3名(降序排列)将会

[{red: 5, blue: 22},  // 22 from blue is largest
{red: 20, blue: 10},  // 20 from red is 2nd largest
{red: 10, blue: 10}]  // 10 from red (or 10 from blue) is 3rd largest

您可以通过使用几个聚合阶段来做到这一点,请考虑以下几点:

db.collection.aggregate([
  {
    "$addFields": {
      maxMarbleCount: {
        $max: [
          "$red",
          "$blue"
        ]
      }
    }
  },
  {
    "$sort": {
      maxMarbleCount: -1
    }
  },
  {
    "$limit": 3
  }
])

基本上,我向每个文档添加了一个名为maxMarbelCount的临时字段,该字段由最大红色/蓝色值确定。 然后,您可以( desc )按此字段排序并相应地进行限制。

如果需要,您可以添加另一个projection阶段以从 output 中删除临时字段。

这是 mongoplayground 上的一个示例: https://mongoplayground.net/p/QApaz7YKWy8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM