Mongodb Mongoose:如何获得N个随机文档,然后再从上一批中获得N个无重复的随机文档

Mongodb Mongoose:如何获得N个随机文档,然后再从上一批中获得N个无重复的随机文档,mongodb,mongoose,Mongodb,Mongoose,我正在尝试从我的收藏中获取N个随机文档,然后再获取N个随机文档,每个后续批次都没有重复的文档。我能够使用下面的聚合来获取第一批文档,但我不太确定以后要做什么 const aggregate = Model.aggregate([{ $sample: { size } }]); 现在我在想我必须使用光标?不太清楚它是如何工作的。您必须使用一些代码: (我看到您使用了mongoose,所以我用mongoose语法来写这篇文章) 请注意,这需要第二个管道将整个集合减去样本数据量后的第一个$match

我正在尝试从我的收藏中获取N个随机文档,然后再获取N个随机文档,每个后续批次都没有重复的文档。我能够使用下面的聚合来获取第一批文档,但我不太确定以后要做什么

const aggregate = Model.aggregate([{ $sample: { size } }]);

现在我在想我必须使用光标?不太清楚它是如何工作的。

您必须使用一些代码:

(我看到您使用了
mongoose
,所以我用
mongoose
语法来写这篇文章)

请注意,这需要第二个管道将整个集合减去样本数据量后的第一个
$match
。这可能是非常低效的

根据您的规模,我建议添加一些启发式方法,比如让我们假设样本大小为
x
,并且我们有
y
数据库中的文档

我会使用类似以下管道的方法:

const aggregate = Model.aggregate([{ $sample: { size: x } }]);

const aggregate2 = Model.aggregate([
    { $sample: { size: 2x } }
    { $match: { _id: {$nin: aggregated.map(val => val._id)}}},
    { $limit: x }
]);

您可以修改数字(2x是上限,但取决于数据集的大小,它可能会降低,成功的概率很高),这将允许您在使用
$sample
索引获取的同时,在第二个管道中接收x个唯一的文档

这都是假设您符合索引使用条件:

$sample是管道的第一阶段

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

该集合包含100多个文档


您必须使用一些代码:

(我看到您使用了
mongoose
,所以我用
mongoose
语法来写这篇文章)

请注意,这需要第二个管道将整个集合减去样本数据量后的第一个
$match
。这可能是非常低效的

根据您的规模,我建议添加一些启发式方法,比如让我们假设样本大小为
x
,并且我们有
y
数据库中的文档

我会使用类似以下管道的方法:

const aggregate = Model.aggregate([{ $sample: { size: x } }]);

const aggregate2 = Model.aggregate([
    { $sample: { size: 2x } }
    { $match: { _id: {$nin: aggregated.map(val => val._id)}}},
    { $limit: x }
]);

您可以修改数字(2x是上限,但取决于数据集的大小,它可能会降低,成功的概率很高),这将允许您在使用
$sample
索引获取的同时,在第二个管道中接收x个唯一的文档

这都是假设您符合索引使用条件:

$sample是管道的第一阶段

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

该集合包含100多个文档