通过使用{ $sample: { size: 3 } }进行聚合,我将返回3随机文档。
如何使用所有文档的百分比来代替?
看起来像{ $sample: { size: 50% } }的东西
发布于 2020-01-15 17:47:56
您不能这样做,因为表达式到$sample应该是一个正数。
如果仍然需要使用$sample,可以尝试获取集合中文档的总数,获取其中的一半&然后运行$sample:
1)计算集合中的no.of文档(mongo Shell):
var totalDocumentsCount = db.yourCollectionName.count()/2
print(totalDocumentsCount) // Replace it with console.log() in code2)随机文档的$sample:
db.yourCollectionName.aggregate([{$sample : {size : totalDocumentsCount}}])注:
如果您想从集合中获得一半的文档(占文档的50% ),那么$sample可能不是一个好的选择--它可能成为一个效率低下的查询。而且,$sample的结果可以返回重复的文档(因此,您可能无法获得唯一的50%的文档)。试着在这里阅读更多关于它的内容:$sample
发布于 2021-04-16 18:27:52
如果有人在PHP中寻找此解决方案,只需按照您的最终聚合(即在投影之前)使用它,并避免使用限制和排序。
[
'$sample' => [
'size' => 30
]
]发布于 2021-12-04 08:28:22
从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的情况下过滤它们。这样,您可以在输出中获得或多或少的文档,并且多次运行这些文档并不一定会给出相同的输出。
https://stackoverflow.com/questions/59753520
复制相似问题