[英]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.