Mongo 按日期排序,除非满足条件?

问题描述 投票:0回答:1

假设我有以下数据:

时间 已提交
1 正确
2 正确
3 正确
4 错误
5 错误
6 错误

我的目标是获取最旧的未提交的或最新提交的。这是用于加载用户时间表,因此如果他们有旧的未提交时间表,我想默认加载它。如果没有,我想向他们展示最新的时间表。

查询后我希望数据按以下顺序返回:

时间 已提交
4 错误
5 错误
6 错误
3 正确
2 正确
1 正确

请注意,前 3 条记录为 false,因此它们按升序时间排序,而后 3 条记录为 true,因此它们按降序时间排序。

这是 mongoplayground 数据示例:

https://mongoplayground.net/p/yEtgMOfZ_ik

我猜这可以通过投影一些值作为排序依据来完成,但我无法理解需要什么。

mongodb mongodb-query aggregation-framework
1个回答
0
投票

您已经对

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

蒙戈广场

© www.soinside.com 2019 - 2024. All rights reserved.