2017-09-25 49 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}}])