使用$ sample进行MongoDB聚合

时间:2020-01-15 14:31:56

标签: mongodb mongoose aggregation sample

{
    "_id" : 1,
    "country" : "us",
    "source" : "ARIN",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T08:52:32.434Z")
},
{
    "_id" : 2,
    "country" : "us",
    "source" : "ARIN",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T09:52:32.434Z")
},
{
    "_id" : 3,
    "country" : "cn",
    "source" : "APNIC",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T10:52:32.434Z")
},
{
    "_id" : 4,
    "country" : "eu",
    "source" : "RIPE",
    "status" : "NEW",
    "createdDate" : ISODate("2016-05-03T10:52:32.434Z")
},

当我们将其用于聚合时 { $sample: { size: 3 } }将返回3个随机文档。 如何使用百分比。示例:{ $sample: { size: 50% } }吗?

2 个答案:

答案 0 :(得分:1)

您无法执行此操作,因为$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

答案 1 :(得分:0)

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

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