MongoDB随机聚合文档(唯一结果)

MongoDB随机聚合文档(唯一结果),mongodb,mongodb-query,Mongodb,Mongodb Query,我已经了解到,可以使用db.collection.aggregate和$sample从集合中获取随机文档。但是我也读到$sample不是100%可靠的,因此,我写了这个查询: db.blog.aggregate( {"$sample": { "size": 100 } }, {"$group": { "_id" : "$post_id", "post" : { "$push" : "$$ROOT" }}} ) 是的,我尝试按分组,但问题是在循环中,它变得比应该的更复杂,即在查询来

我已经了解到,可以使用db.collection.aggregate和$sample从集合中获取随机文档。但是我也读到$sample不是100%可靠的,因此,我写了这个查询:

db.blog.aggregate(
   {"$sample": { "size": 100 } }, 
   {"$group": { "_id" : "$post_id", "post" : { "$push" : "$$ROOT" }}}
)
是的,我尝试按分组,但问题是在循环中,它变得比应该的更复杂,即在查询来自MongoDB的结果时

如有任何建议,我们将不胜感激

编辑:我想知道,分组是获得唯一结果所必需的,还是有更好的方法。让$group for aggregate从MongoDB返回几个唯一且不重复的随机文档是没有意义的


是的,我将ID设置为实际集合中唯一的索引

好的,让我们开始澄清$sample的独特性问题,因为它不像您想象的那样直截了当

首先,让我们看看文档中指定的$sample条件:

$sample是管道的第一阶段

N不到集合中文档总数的5%

该集合包含100多个文档

如果不满足这些条件,mongo将使用sort and pick random documents执行收集扫描。在这种情况下,不会出现重复

假设满足这些条件,则可以通过称为。 只有当您对集合执行了更新/删除操作,而这些操作可能会“破坏”集合的索引时,才会发生这种情况


因此,假设您处于最后一种情况,并且您的集合在查询时正在更新,那么如果您希望100%确保不会返回DUP,那么分组是您的最佳选择。因此,将100个文档分组是一个值得担心的小开销。

好的,让我们开始澄清$sample唯一性问题,因为它不像您想象的那么简单

首先,让我们看看文档中指定的$sample条件:

$sample是管道的第一阶段

N不到集合中文档总数的5%

该集合包含100多个文档

如果不满足这些条件,mongo将使用sort and pick random documents执行收集扫描。在这种情况下,不会出现重复

假设满足这些条件,则可以通过称为。 只有当您对集合执行了更新/删除操作,而这些操作可能会“破坏”集合的索引时,才会发生这种情况

因此,假设您处于最后一种情况,并且您的集合在查询时正在更新,那么如果您希望100%确保不会返回DUP,那么分组是您的最佳选择。因此,对100个文档进行分组是一个相当小的开销,值得担心。

如果您有一个over the post_id字段,那么在采样后就不需要进行分组操作

请参阅:

如果在post_id字段上有一个标记,则采样后不需要进行分组操作



请参阅:

您能否澄清您的具体要求?当前查询结果有什么问题?“你希望它们是什么?”汤姆斯拉巴特,谢谢你的回答。我希望聚合能给我带来唯一的结果作为回报。我在某个地方读到,当使用$sample时,它可以返回副本。此外,我还想知道是否有比被迫使用$group更好的原因。仍然不清楚你在问什么。请你再解释一下。@ash,看我的最新编辑,谢谢!您需要哪个字段的唯一文档?如果postId已设置为唯一,则不需要在此处使用组。如果你想要随机文件,那么样本就可以了。你能澄清一下你到底在问什么吗?当前查询结果有什么问题?“你希望它们是什么?”汤姆斯拉巴特,谢谢你的回答。我希望聚合能给我带来唯一的结果作为回报。我在某个地方读到,当使用$sample时,它可以返回副本。此外,我还想知道是否有比被迫使用$group更好的原因。仍然不清楚你在问什么。请你再解释一下。@ash,看我的最新编辑,谢谢!您需要哪个字段的唯一文档?如果postId已设置为唯一,则不需要在此处使用组。如果您需要随机文件,那么样本将完成这项工作。谢谢您的回答。100是我贴在这里的一个样本,你觉得5000怎么样?谢谢你的回答。100是我在这里发布的一个示例,关于5000,你会怎么说?有什么理由不能将post_id作为_id字段吗?如果你可以用post_id替换_id,如果当前它是自动生成的,没有信息值,那么基本上你不需要;“我不需要再添加索引。@约翰·史密斯关于这个问题还有任何疑问吗?需要进一步调查。调查什么?”?请分享您的疑问。我还没有时间测试您的建议。有什么理由不能将post\u id作为\u id字段吗?如果您可以替换_id,如果当前
通常,它是自动生成的,没有带有post_id的信息值,那么基本上你没有;“我不需要再添加索引。@约翰·史密斯关于这个问题还有任何疑问吗?需要进一步调查。调查什么?”?请分享你的疑问。我还没有时间测试你的建议。