首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用$sample进行聚合

使用$sample进行聚合
EN

Stack Overflow用户
提问于 2020-01-15 14:31:56
回答 3查看 911关注 0票数 1

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-15 17:47:56

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

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

1)计算集合中的no.of文档(mongo Shell):

代码语言:javascript
复制
var totalDocumentsCount = db.yourCollectionName.count()/2

print(totalDocumentsCount) // Replace it with console.log() in code

2)随机文档的$sample

代码语言:javascript
复制
db.yourCollectionName.aggregate([{$sample : {size : totalDocumentsCount}}])

注:

如果您想从集合中获得一半的文档(占文档的50% ),那么$sample可能不是一个好的选择--它可能成为一个效率低下的查询。而且,$sample的结果可以返回重复的文档(因此,您可能无法获得唯一的50%的文档)。试着在这里阅读更多关于它的内容:$sample

票数 1
EN

Stack Overflow用户

发布于 2021-04-16 18:27:52

如果有人在PHP中寻找此解决方案,只需按照您的最终聚合(即在投影之前)使用它,并避免使用限制和排序。

代码语言:javascript
复制
[
  '$sample' => [                                                                                                     
                 'size' => 30                                                                                                
               ]                                                                         
]
票数 0
EN

Stack Overflow用户

发布于 2021-12-04 08:28:22

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

代码语言:javascript
复制
// { 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的情况下过滤它们。这样,您可以在输出中获得或多或少的文档,并且多次运行这些文档并不一定会给出相同的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59753520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档