mongoose得到一个除了一个随机元素

我有一个MongoDB的文章集合。 我select了一篇我想呈现的文章,并且我想要随机select其他两篇文章。 我想在我的collections中挑选两篇不一样的文章,而不是我之前select的文章。 一直在这个问题上几个小时,寻找一个解决scheme,但只发现如何随机挑选一个元素,但不是除了一个…

这是我现在拥有的:

article.find({}, function(err, articles{ var articleChosen = articles.filter(selectArticleUrl, articleUrl)[0]; article.find({}) .lean() .distinct("_id") .exec(function(err, arrayIds){ var articleChosenIndex = arrayIds.indexOf(articleChosen._id); arrayIds.splice(articleChosenIndex, 1); chooseRdmArticle(arrayIds, function(articleRdm1Id){ var articleRmd1 = articles.filter(selectArticleId, articleRdm1Id)[0]; var articleRdm1Index = arrayIds.indexOf(articleRdm1Id); arrayIds.splice(articleRdm1Index, 1); chooseRdmArticle(arrayIds, function(articleRdm2Id){ var articleRmd2 = articles.filter(selectArticleId, articleRdm2Id)[0]; // do stuff with articleChosen, articleRmd1 and articleRmd2 }) }) }) }) 

哪里selectrdm文章的function是:

 function chooseRdmArticle(articles, callback){ var min = Math.ceil(0); var max = Math.floor(articles.length); var rdm = Math.floor(Math.random() * (max - min)) + min; callback(articles[rdm]) } 

从它的urlselect文章的function是:

 function selectArticleUrl(element){ return element.url == this } 

我的想法是在包含所有ObjectId( arrayIds here)的数组上工作,在删除articleChosen id后随机select两个ID。 但我明白, arrayIds.indexOf(articleRdm1Id); 无法工作,因为ObjectIds不是string…有没有一种方法来find我想要的Id的索引? 还是有更好的主意?

非常感谢 !

运行两个查询,其中第一个提取所选文档,另一个使用聚合框架运行带有$sample运算符的pipe道,以从集合中返回2个随机文档,除了所选文档之外。

以下查询使用Mongoose的内置Promises来演示:

 let chosenArticle = article.find({ "url": articleUrl }).exec(); let randomArticles = article.aggregate([ { "$match": { "url": { "$ne": articleUrl } } }, { "$sample": { "size": 2 } } ]).exec(); Promise.all([chosenArticle, randomArticles]).then(articles => { console.log(articles); }); 

有mongodb命令$ sample ,它将以随机方式读取文档。


来自文档的示例

db.users.aggregate([{$ sample:{size:3}}])