MongoDB随机汇总文档(唯一结果)

时间:2019-07-10 12:00:04

标签: mongodb mongodb-query

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

db.blog.aggregate(
   {"$sample": { "size": 100 } }, 
   {"$group": { "_id" : "$post_id", "post" : { "$push" : "$$ROOT" }}}
)

是的,我正在尝试分组,但是问题是,在一个循环中,它变得比随后要复杂,即,当从MongoDB查询结果时。

任何建议,谢谢,在此先感谢。

编辑:我想知道,进行分组以获取唯一的结果是必要的,还是有更好的方法来做到这一点?没有必要让$ group进行汇总来从MongoDB中向我返回一些唯一且不重复的随机文档,这没有任何意义。

是的,我在实际集合中将ID设置为INDEX唯一。

2 个答案:

答案 0 :(得分:3)

如果post_id字段上有unique index,则在采样后无需进行分组操作。

引用:https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/#faq-developers-isolate-cursors

答案 1 :(得分:1)

好吧,让我们开始澄清$ sample唯一性问题,因为它不像您想象的那样直接。

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

  
      
  1. $ sample是管道的第一阶段

  2.   
  3. N小于集合中文档总数的5%

  4.   
  5. 馆藏包含100多个文档

  6.   

如果不满足这些条件,mongo将对分类进行收集扫描并随机选择文档(在这种情况下,不会重复)。

假设满足这些条件,那么cursor isolation可能会出现重复的ID。 仅当您对集合进行了更新/删除操作,而这些操作可能会“索引”索引时,这种情况才会发生。

因此,假设您处于最后一种情况,并且在查询时正在更新您的收藏集,那么如果您想确保100%不返回任何复制品,则分组是最好的选择。 (因此,将100个文档归为一组是相当小的开销,无需担心)。