2012-11-28 36 views
0

我有一些文件看起來像:的MapReduce將項目插入一個新的集合,以隨機順序

{ 
    _id: 3, 
    key: 3, 
    stuff: "Some data" 
} 

一些文件也有signUpDate

我們可以填充用於演示目的集合像這樣:

for(i=1; i<=100000; i++){ 
if(i%3===0) 
    db.numbers.insert({_id:i, key:i, stuff:"Some data", signUpDate: new Date()}); 
else 
    db.numbers.insert({_id:i, key:i, stuff:"Some data"}); 
} 

...這樣的文件,第三有signUpDate

我想要做的就是創建一個映射精簡函數,它所有的文件,其中signUpDate不爲空,並將其插入到一個單獨的集合,隨機排序

這可能嗎?

+0

可以你澄清你的意思是「隨機排序」?你的意思是你想$自然順序不對應於id順序嗎?另外,你的收藏在現實生活中有多大? –

+0

我的意思是...沒有插入1,2,3,4,5等等...(正如你所看到的,文件的ID是遞增的整數) 數據集大約在'現實生活' – Alex

+0

技術上mongodb不按順序插入,所以文檔已經部分隨機化。但是要在集合中隨機插入(均勻分佈);那麼一種方法是在目標集合中使用增量id或0和1之間的rand()編寫2m行,然後使用rand()來更新目標集合中該行與來自源的行,但是,您的可能只是想隨機選擇它們而不是隨機自然排序,因爲再次選擇它們不會像自然順序那樣隨機排列 – Sammaye

回答

0

好吧,這裏是一個可行的解決方案:

使用mongoshell:

首先,我們來填充我們的數據:

for(i=1; i<=100000; i++){ 
if(i%3===0) 
    db.numbers.insert({_id:i, key:i, stuff:"Some data", signUpDate: new Date()}); 
else 
    db.numbers.insert({_id:i, key:i, stuff:"Some data"}); 
} 

所以,現在,我們有我們的數據的第三與signUpDate 。

現在,一個超簡單的MapReduce:

m = function() {emit(this._id, Math.random());} 
r = function(key, values){} 

db.numbers.mapReduce(m,r, {out: "randomlyOrdered", query: { signUpDate: { $ne : null } }}); 

接下來,ensureIndex加快排序:

db.randomlyOrdered.ensureIndex({"value":1}); 

現在,找到號碼(隨機排序)

db.randomlyOrdered.find({}, {"_id":1}).sort({"value":1}); 
+0

但是'stuff'中的數據也不會被寫入,它仍然會按照大致的順序插入,但是由於在輸入查詢中不存在排序,所以它仍然會贏得' t完全是「隨機的」 – Sammaye

+0

是的,但我們可以使用最後一個查詢從集合中查詢它(randomOrdered) - 不完全正是我想要的,但儘管它會得到我認爲 – Alex

+0

好吧,好長時間因爲你使用其他集合作爲rand()上的查找應該工​​作得很好,我只是認爲......我知道這聽起來很愚蠢,但爲什麼不把rand()放在原始集合上?我的意思是你現在基本上是在尋找隨機的,而不是真正的隨機插入。 – Sammaye

相關問題