使用 $sample 聚合

Aggregation using $sample

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

如何使用所有文档的百分比来代替?

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

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

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

1) 计算集合中的 no.of 个文档 (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

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

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

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,则过滤它们。这样你可能会在输出中得到或多或少的文档,运行这几次不一定会给你相同的输出。