2011-09-13 96 views
14

我在MongoDB中有一個字段,它是一個字符串。 {"field": "some text"},我想將它們全部轉換爲數組。 {"field": ["some text"]}mongodb類型更改爲數組

我知道我可以循環遍歷所有文檔,獲取字段,然後更新,但我想知道是否有更清晰的方式。

謝謝。

回答

3

你可以在map/reduce的Reduce函數中做到這一點,以保持mongodb中的所有處理。基本上你可以使用map/reduce把結果放到一個新的集合中,然後你可以將它們複製回舊集合(或刪除舊集合並重命名新集合)。這具有將mongo中的所有內容都保存起來的優點。

更新:另一種選擇可能是你爲此使用db.evaldb.eval在服務器上執行,以便在服務器上完成更新,而無需任何流量/延遲。

我認爲唯一的其他選擇就像你描述的那樣 - 在客戶端通過查詢和更新每個選項來完成。

+0

你認爲在地圖蒙戈減少會更快? – Harry

+0

主要取決於您在服務器和客戶端之間移動了多少文檔和多少數據。如果在服務器/客戶端之間有大量數據移動,那麼您希望使用mapReduce將處理保留在MongoDB中,或者嘗試db.eval(正如我剛纔在上面的編輯中添加的那樣)。 –

+0

感謝db.eval,總是樂於學習新的東西。 – Harry

0

,但我不知道是否有一個更清潔的方式..

簡短的答案是否定的。

MongoDB沒有任何單個操作或命令來執行「更改類型」。

最快的方法是使用其中一個驅動程序並進行更改。您可以使用shell並編寫for循環,但就原始速度而言,其他驅動程序可能會更快。

這表明,進程的最慢部分將要將所有數據從磁盤加載到內存中進行更改,然後將該數據清空回磁盤。即使有神奇的「更改類型」命令,情況也是如此。

3

試試這個,而不是

這是從字符串更改字段的類型數組中的MongoDB

db.jobs.find({ "jobLocationCity" : { $type : 2 } }).forEach(function (x) { 
    x.jobLocationCity = {"Location":x.jobLocationCity}; 
    db.jobs.save(x); 
}); 

看到該鏈接爲$類型的 possible values

+0

這個答案讓我想到了一個我覺得非常簡潔的解決方案。我在這裏提供的示例中遇到的問題是,因爲在forEach循環中正在調用save(),所以光標變得混亂,並且該函數將多次調用相同的文檔。解決方法是在foreach之前調用snapshot(): db.jobs.find(blah).snapshot()。forEach() –

10

尼廷加爾格的回答上面幾乎作品,除了他的例子從一個字符串轉換爲散列,而不是一個數組的字符串。

考慮到喬爾·哈里斯的意見,妥善解決會是什麼樣子:

db.jobs.find({ "jobLocationCity" : { $type : 2 } }).snapshot().forEach(function (x) { 
    x.jobLocationCity = [ jobLocationCity ]; 
    db.jobs.save(x); 
}); 

或者如果使用db.eval:

function f() { 
    db.jobs.find({ "jobLocationCity" : { $type : 2 } }).snapshot().forEach(function (x) { 
     x.jobLocationCity = [ jobLocationCity ]; 
     db.jobs.save(x); 
    }); 
} 
db.eval(f); 
+2

小修正: x.jobLocationCity = [x.jobLocationCity]; – Vitamon

+0

爲什麼「保存」而不是「更新」? – nilskp

5

其實,查找({ 「jobLocationCity」:{ $ type:2}})將無法正常工作, ,因爲如果您下次運行更新腳本,它會再次將['mystring']元素視爲字符串類型。

你應該使用這樣的事情,以防止它:

db.message_info.find({ "jobLocationCity" : { $type : 2 } } ).snapshot().forEach(
    function (x) { 
    if (!Array.isArray(x.jobLocationCity)){ 
     x.jobLocationCity = [ x.jobLocationCity ]; 
     db.jobs.save(x); 
    } 
    } 
) 

看到http://docs.mongodb.org/manual/reference/operators/