【问题标题】:Aggregation using $sample使用 $sample 进行聚合
【发布时间】:2020-05-02 08:16:00
【问题描述】:

通过使用{ $sample: { size: 3 } } 进行聚合,我将得到3 返回的随机文档。

我怎样才能改用所有文档的百分比?

看起来像 { $sample: { size: 50% } } 的东西?

【问题讨论】:

  • 这里我们想修复代码问题。请尝试一些方法来改进您的更改,以获得我们的帮助。同时阅读How to Ask 可能是值得的。

标签: mongodb random aggregation-framework sample


【解决方案1】:

Mongo 4.4开始,可以使用$sampleRate操作符:

// { x: 1 }
// { x: 2 }
// { x: 3 }
// { x: 4 }
// { x: 5 }
// { x: 6 }
db.collection.aggregate([ { $match: { $sampleRate: 0.33 } } ])
// { x: 3 }
// { x: 5 }

这匹配随机选择的输入文档 (33%)。所选文档的数量近似于以文档总数百分比表示的采样率。

请注意,这相当于为每个文档添加一个介于 0 和 1 之间的随机数,如果该随机值低于 0.33,则将它们过滤掉。这样您可能会在输出中获得更多或更少的文档,并且运行几次不一定会得到相同的输出。

【讨论】:

    【解决方案2】:

    如果有人在 PHP 中寻找这个解决方案,只需在最后(即投影之前)在聚合中使用它并避免使用限制和排序

    [
      '$sample' => [                                                                                                     
                     'size' => 30                                                                                                
                   ]                                                                         
    ]
    

    【讨论】:

      【解决方案3】:

      你不能这样做,因为$sample的表达式应该是一个正数。

      如果您仍然需要使用$sample,您可以尝试获取集合中文档的总数,获取其中的一半然后运行$sample

      1) 统计集合中的文档数(mongo Shell):

      var totalDocumentsCount = db.yourCollectionName.count()/2
      
      print(totalDocumentsCount) // Replace it with console.log() in code
      

      2) $sample 用于随机文档:

      db.yourCollectionName.aggregate([{$sample : {size : totalDocumentsCount}}])
      

      注意:

      如果您想从集合中获取一半的文档(即 50% 的文档),那么 $sample 可能不是一个好的选择 - 它可能会成为一个低效的查询。 $sample 的结果也可能返回重复的文档(所以实际上你可能不会得到唯一的 50% 的文档)。尝试在这里阅读更多信息:$sample

      【讨论】:

      • 我知道你会读 $sample 谢谢。主要问题。 --> 我有一个包含大量数据的表,我的目标是创建一个过滤器,它将输入 % 数据
      • @Babken : 那么你想获得前几个 % 或后几个 % 的随机 % 唯一文档,还是只是随机 % 的文档?
      • 只是随机的 % 个文件,我想知道 mongo 中是否有现成的功能?或者我需要做一些自定义的事情。
      • @Babken :据我所知,% 没有任何内容,您可以使用 $limit 获取一定数量的文档,但这也需要一个数字,但我建议选择$sample 因为它会给你随机文件,但你需要按照上面的建议做:-)
      • { $unwind: '$items' }, { $match: { 'items.polNum': { $exists: true } } }, { $project: { _id: '$items._id', polNum: '$items.polNum', polProdCode: '$items.polProdCode', **myVariable**: '$countSomething', (..etc...) } }, { $sample: { size: **'$<myVariable>'** } }, 好的,那么我需要将示例“myVariable”作为我从之前的聚合查询中获得的整数
      猜你喜欢
      • 2020-12-25
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多