2017-09-25 69 views
1

我有一个MongoDB中的文章集合。我选择了一篇我想呈现的文章,并且我希望随机选择其他两篇文章。我想在我的收藏中选择两篇不一样的文章,而不是我之前选择的文章。 去过这个问题了几个小时,寻找一个解决方案,但只找到如何挑选随机的元素,但不能除一...猫鼬得到一个除了一个之外的随机元素

这是我现在有:

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 
     }) 
     }) 
    }) 
    }) 

其中函数其中选择RDM文章:

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]) 
} 

,并从它的URL选择文章的功能是:

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

我的想法是在包含所有ObjectId(这里是arrayIds)的数组上工作,在删除articleChosen id后随机选择两个ID。但我明白arrayIds.indexOf(articleRdm1Id);不能工作,因为ObjectIds不是字符串...有没有一种方法来找到我想要的Id的索引?或者有更好的主意?

非常感谢!

回答

0

运行两个查询,其中首先获取所选文档,另一个使用聚合框架与运算符运行流水线,以便从集合中返回2个随机文档excel选择一个。

下面的查询使用猫鼬的内置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); 
}); 
+1

非常感谢!通过试图了解你的答案了解了很多,谢谢! –

0

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


实施例:

db.users.aggregate([{$样品:{尺寸:3}}])