2013-02-21 29 views
0

嗨我想從集合中隨機顯示6行。每一行作爲一個時間戳,所以我可以用這一點,但我的問題是如何從收集只返回6行,並使其隨機MongoDB從集合中返回6個隨機行

這裏是我收集的樣本 - 我用PHP

{ 
    "age": "2", 
    "breed": "Bengal", 
    "dislikes": "Dislikes being patted by people", 
    "likes": "Like to purr and get headbutts. Sleeps on our bed, with Woody our dog, and also comes in for food at 6pm, loves Tin fish and is known to meow quite lo [...]", 
    "lost": true, 
    "pet_lost_date": NumberInt(1361366445), 

    "type": "cat" 
} 

我看到這個 db.items.find()。skip(randonNumberHere).limit(1); - MongoDB: Pulling multiple random documents from a collection

但我不明白這一點,我從中明白的是find()找到所有的skip(),它跳過了一些行和limit(),這是多少返回。

但是我的問題更多的是讓所有的丟失的寵物和隨機他們,只顯示6

public function lost_pets($no){ 
     $collection = static::db()->ipet_mypet; 
     $pet = $collection->find(array('lost': true, '$where'=> function(){var randomNumber=Math.random(); return this.random>=randomNumber || this.random>randomNumber })).sort(array('pet_lost_date'=> 1)).limit(6); 
    } 

回答

0

您可以使用此:

db.collection.find({'lost': true, $where: function(){var randomNumber=Math.random(); return this.pet_lost_date>=randomNumber || this.pet_lost_date>randomNumber }}).next(); 

查找({ '丟失': true})獲取字段爲'lost'的文檔:true。

$ where子句返回一個DBCursor,它指向一個特定的文檔。通過調用「next()」,我們獲得光標指向的下一個文檔。所以我們一次拿一個隨機文件。

+2

問題是它並沒有真正給你「6個隨機行」。它爲您提供6個從隨機偏移量開始的順序文檔。這意味着兩次挑選6份相同文檔的機會=挑選相同偏移量兩次的機會 – 2013-02-21 18:37:00

+0

但仍然會依次顯示丟失的結果。我想要做的是隨機丟失的是真實的說我有300丟失:真正我想顯示6隨機 – RussellHarrower 2013-02-21 18:37:48

+0

@RussellHarrower爲了使這個稍微更隨機,你可以選擇,例如,從Mongo返回12文件(而不是6)。然後,在PHP中,你可以隨機選擇那12個。然後,即使你設法隨機選擇了相同的偏移量(並且從Mongo中得到相同的12),那麼你的PHP隨機選擇也會選擇相同的子集6. – 2013-02-21 18:42:22

0

根據我從邏輯上看的方式,簡單的方法是用一個隨機數保存記錄,然後在從數據庫中讀取數據時按照該數字進行排序。

0

讓說你有20個記錄 要隨機取5個記錄

我們會產生介於0到20的隨機跳躍值 - 限制值(5)= 15
有了這個,我們一定要返回5個記錄,即使隨機跳躍值從15
開始我們也可以強制跳過值是零,如果它變爲負值後,我們從。減去總記錄的隨機值

示例代碼:

$total_records = $collection->count(); <br> 
$limit = 5; <br> 
$skip = mt_rand(0, $total_records);<br> 
$collection->find()->skip($skip < 0 ? 0 : $skip)->limit($limit);