假设我有以下数据:
时间 | 已提交 |
---|---|
1 | 正确 |
2 | 正确 |
3 | 正确 |
4 | 错误 |
5 | 错误 |
6 | 错误 |
我的目标是获取最旧的未提交的或最新提交的。这是用于加载用户时间表,因此如果他们有旧的未提交时间表,我想默认加载它。如果没有,我想向他们展示最新的时间表。
查询后我希望数据按以下顺序返回:
时间 | 已提交 |
---|---|
4 | 错误 |
5 | 错误 |
6 | 错误 |
3 | 正确 |
2 | 正确 |
1 | 正确 |
请注意,前 3 条记录为 false,因此它们按升序时间排序,而后 3 条记录为 true,因此它们按降序时间排序。
这是 mongoplayground 数据示例:
https://mongoplayground.net/p/yEtgMOfZ_ik
我猜这可以通过投影一些值作为排序依据来完成,但我无法理解需要什么。
您已经对
submitted
进行了排序:false
在 true
之前排序(在许多语言中为 0 与 1)。 👍 所以这是排序的第一个键。
当
submitted=false
时,您想要时间的升序 (4, 5, 6),当它是 true
时,您想要 相反。
您可以创建一个附加键来根据时间是否已提交进行排序,并使用负数在提交真/假时更改排序顺序。
在这里,我正在创建
timeSort
,它将否定 submitted=true
的时间。所以 3 变成 -3,按升序排列,-3 < -2 < -1. Whereas 4, 5, 6 remain as is so 4 < 5 < 6 in ascending order.
db.collection.aggregate([
{
$set: {
timeSort: {
$multiply: [
"$time",
{ $cond: [ "$submitted", -1, 1 ] }
]
}
}
},
{
$sort: {
submitted: 1,
timeSort: 1
}
},
{ $unset: "timeSort" }
])
您可以在
$cond
和 timeSort
中翻转 1 和 -1,得到相同的结果。$sort
蒙戈广场