MongoDB集合数量不足N时,如何获取N个随机文档?
解决MongoDB $sample无法获取超过集合总数的随机文档问题
这是因为MongoDB的$sample聚合操作有个关键限制:当你指定的size大于集合中的文档总数时,它只会返回集合里所有的现有文档,不会自动重复返回任何文档——这就是你只拿到10条结果的原因。
如果你需要允许重复文档来凑够12条随机结果,可以用以下聚合管道方案,在数据库端完成重复文档生成和随机选取:
question.aggregate([ // 为每个文档生成重复次数的数组(这里计算需要重复2次来覆盖12条需求) { $project: { doc: "$$ROOT", repeats: { $range: [0, { $ceil: { $divide: [12, 10] } }] } } }, // 展开数组,将每个文档复制对应次数 { $unwind: "$repeats" }, // 从扩展后的文档池中随机选取12条 { $sample: { size: 12 } }, // 恢复原始文档结构,移除临时字段 { $replaceRoot: { newRoot: "$doc" } } ]);
逻辑说明:
$range结合$ceil计算需要的重复次数:12/10向上取整为2,所以每个文档会被复制2次,扩展后总共有20条文档。$unwind将数组展开,把每个文档的重复条目拆分为独立文档。- 最后用
$sample从20条里随机选12条,这样结果里会包含重复的随机文档,满足数量要求。
如果你的需求是不允许重复文档,那很遗憾,从只有10条记录的集合里不可能拿到12条不重复的随机文档——这是集合本身的数据量限制,没有办法绕过。
内容的提问来源于stack exchange,提问作者Sindhu Garimella
相关产品推荐
相关产品推荐

