提问者:小点点

MongoDB条件随机排序


我有mongo这样的收藏,

  [{
    id: 1,
    "liked": false,
    "opened": 2022-10-01T00:00:00.000+00:00
  },
  {
    id: 2,
    "liked": true,
    "opened": 2022-10-02T00:00:00.000+00:00
  },
  {
    id: 3,
    "liked": false,
    "opened": 2022-08-03T00:00:00.000+00:00
  },
  {
    id: 4,
    "liked": true,
    "opened": 2022-10-04T00:00:00.000+00:00
  }]

这里喜欢是布尔值,打开是日期时间,我想像下面这样排序

  • 首先显示喜欢=true的记录。
    • 随机化里面的记录
    • 随机化里面的记录
    • 随机排序

    一个样本输出可以是(id 2

      [{
        id: 2,
        "liked": true,
        "opened": 2022-10-02T00:00:00.000+00:00
      },
      {
        id: 4,
        "liked": true,
        "opened": 2022-10-04T00:00:00.000+00:00
      },{
        id: 1,
        "liked": false,
        "opened": 2022-10-01T00:00:00.000+00:00
      },
      {
        id: 3,
        "liked": false,
        "opened": 2022-08-03T00:00:00.000+00:00
      }]
    

    我可以像db.集合. find().sort({喜欢:-1,打开:1})一样排序,然后在我的代码中,我可以通过创建3个组(喜欢=真,打开)来洗牌记录


共1个答案

匿名用户

您可以使用$switch创建一个辅助字段sortOrder来控制您的组顺序。然后使用$rand在组内创建随机排序。

db.collection.aggregate([
  {
    "$addFields": {
      "sortOrder": {
        "$switch": {
          "branches": [
            {
              "case": "$liked",
              "then": 1
            },
            {
              "case": {
                $lt: [
                  {
                    "$dateDiff": {
                      "startDate": "$opened",
                      "endDate": "$$NOW",
                      "unit": "day"
                    }
                  },
                  30
                ]
              },
              "then": 2
            }
          ],
          default: 3
        }
      },
      "rand": {
        "$rand": {}
      }
    }
  },
  {
    $sort: {
      sortOrder: 1,
      rand: 1
    }
  }
])

这里是Mongo游乐场供您参考。