我已经读到可以将db.collection.aggregate
与$sample
一起使用,以从集合中获取随机文档。但是我也读到$ sample不是100%可靠的,因此,我编写了以下查询:
db.blog.aggregate(
{"$sample": { "size": 100 } },
{"$group": { "_id" : "$post_id", "post" : { "$push" : "$$ROOT" }}}
)
是的,我正在尝试分组,但是问题是,在一个循环中,它变得比随后要复杂,即,当从MongoDB查询结果时。
任何建议,谢谢,在此先感谢。
编辑:我想知道,进行分组以获取唯一的结果是必要的,还是有更好的方法来做到这一点?没有必要让$ group进行汇总来从MongoDB中向我返回一些唯一且不重复的随机文档,这没有任何意义。
是的,我在实际集合中将ID设置为INDEX唯一。
答案 0 :(得分:3)
如果post_id字段上有unique index,则在采样后无需进行分组操作。
答案 1 :(得分:1)
好吧,让我们开始澄清$ sample唯一性问题,因为它不像您想象的那样直接。
首先让我们查看文档中指定的$ sample条件:
$ sample是管道的第一阶段
N小于集合中文档总数的5%
馆藏包含100多个文档
如果不满足这些条件,mongo将对分类进行收集扫描并随机选择文档(在这种情况下,不会重复)。
假设满足这些条件,那么cursor isolation可能会出现重复的ID。 仅当您对集合进行了更新/删除操作,而这些操作可能会“索引”索引时,这种情况才会发生。
因此,假设您处于最后一种情况,并且在查询时正在更新您的收藏集,那么如果您想确保100%不返回任何复制品,则分组是最好的选择。 (因此,将100个文档归为一组是相当小的开销,无需担心)。