我會反正規化一點,並添加一個'喜歡'計數器字段到被喜歡的對象。對象獲得喜歡時遞增,當對象不被喜歡時遞減。
db.test.insert({
stuff: "likable stuff",
likes: 7
})
然後我也有一個代表該對象是爲喜歡的結果鬥另一個領域。因此,例如,對象開始時這個字段設置爲「普通」,並且在有人獲得10個喜歡後,他們將成爲「精英」。 (或任何你想要的)當它們達到該閾值時更新它。這裏的想法是,在寫入過程中進行工作會使讀取操作更容易。
db.test.insert({
stuff: "likable stuff",
likes: 7,
status: "ordinary/elite",
})
好吧,現在選擇基於#of likes定義的組中的對象組很容易吧? db.collection.find({ status: 'elite' })
要在這些集合中隨機化文檔選擇,您可以隨機跳過一定數量的記錄,但這會導致可怕的性能並且無法擴展。
但是,您可以執行一個技巧,將隨機生成的數字存儲在文檔中。
讓我們插入這些傢伙一個到測試數據庫,並檢查了
db.test.insert({
stuff: "likable stuff",
likes: 7,
status: "ordinary/elite",
random: Math.random()
})
讓我們來看看文檔現在:
{
stuff: "likable stuff",
likes: 7,
status: "ordinary/elite",
random: 0.9375813045563468
}
好,這裏是這個變得很酷。做一個findOne()查詢,其中狀態:精英和 rand_num:$ gt {另一個隨機生成的數字btw 0和1}。
db.collection.find({ status: "elite", random: { "$gt": new_rand_num } })
如果findOne()查詢不返回結果,與$ LT再次這樣做,你一定會在方向中的至少一個找到的文件。
現在讓我們指出狀態和隨機。
db.collection.ensureIndex({ status: 1, random: 1} })
你覺得呢?
什麼是'算法'?算法過去了'街道'? –
米奇請... –
我接受了你的建議,並用類似的列進行了非規範化處理。現在,我只是要使用skip方法,但是如果我看到數據增加和縮放問題,那麼隨機生成結果的方法似乎很棒! – MEURSAULT