MongoDB获得匹配过滤器的X %结果

vojdkbi0  于 2023-01-30  发布在  Go
关注(0)|答案(1)|浏览(177)

我有这样的记录

[
  {
    "key": 1,
    "val":"1"
  },
  {
    "key": 2,
    "val":"1"
  },
  {
    "key": 3,
    "val":"1"
  },
  {
    "key": 4,,
    "val":"2"
  }
]

我想激活这样的东西,如果我给予一个过滤器{val:"1"},我希望能够得到50%(四舍五入)的随机结果。例如,一个可能的预期结果可能是

{
    "key": 1,
    "val":"1"
  },
  {
    "key": 2,
    "val":"1"
  }

我本可以在获得所有结果后在代码中处理此问题,但这是聚合管道中的步骤之一,此阶段的输出将用作管道下一阶段的输入。

j9per5c4

j9per5c41#

您可以先按$rand创建一个随机排序关键字。使用$setWindowFields计算$rank和total。最后使用$divide计算相对排名,并按小于您喜欢的阈值/抽样百分比的值查找。

db.collection.aggregate([
  {
    "$addFields": {
      "randSortKey": {
        "$rand": {}
      }
    }
  },
  {
    "$setWindowFields": {
      "partitionBy": null,
      "sortBy": {
        "randSortKey": 1
      },
      "output": {
        "rank": {
          "$rank": {}
        },
        total: {
          $sum: 1
        }
      }
    }
  },
  {
    "$match": {
      $expr: {
        $lte: [
          {
            "$divide": [
              "$rank",
              "$total"
            ]
          },
          0.5
        ]
      }
    }
  },
  {
    "$unset": [
      "randSortKey",
      "rank",
      "total"
    ]
  }
])

Mongo Playground

相关问题