2012-07-01 59 views
5

我們有一個應用程序,它在C/C++中存儲MongoDB中的一些配置值,並且具有重新啓動的能力(即運行一段時間,有人中斷應用程序,更改配置,然後再次運行應用程序,並從中斷的地方開始)。這就像布爾和字符串配置的魅力一樣。然後我們有一些整數(在我們當前的C/C++實現 - 32位值)。當我使用MongoDB控制檯修改這些整數值時,Mongo始終將它們存儲爲Number(在C/C++實現中可用)。我們將更改應用程序以在需要整數的地方使用double值,但是我想知道是否有辦法強制Mongo從其JavaScript控制檯存儲整數。將MongoDB字段的類型更改爲控制檯的整數

有什麼建議嗎?

+0

使用parseFloat()重新保存值,或者不要在值的周圍放置任何語音標記 – Sammaye

+1

其實嘗試parseInt()對不起 – Sammaye

回答

9

在C/C++「單詞意義」中,整數爲not actually guaranteed爲32位值。一個int必須至少爲16位,但通常與平臺架構相匹配(例如32或64位)。

正如@Jasd所述,JavaScript只有一個數值類型,它是一個浮點數(C中的double)。

從MongoDB shell中,您應該可以使用函數NumberInt(..)獲取BSON 32-bit integer valueNumberLong(..)以獲得BSON 64位整數。

+1

漂亮的關於int大小的捕獲! –

+0

注意事項https://jira.mongodb.org/browse/SERVER-5424 – nikow

0

MongoDB的shell由JavaScript引擎提供動力。而且JavaScript沒有integer的類型。它只知道Number,這是一種浮點數的類型。
你可以嘗試使用MongoDB類型NumberLong,但是當我遇到同樣的問題時,它並不適用於我。

8

你可以像固定類型的所有值的控制檯上某一個領域:

db.Statistic.find({kodoId: {$exists: true}}).forEach(function (x) { 
    x.kodoId = NumberInt(x.kodoId); 
    db.Statistic.save(x); 
}); 

這將只顯示有該kodoId領域,並將其轉換爲int並重新保存加載文檔。你可以這樣做:

db.Statistic.find({kodoId: {$exists: true}}, {kodoId: 1}).forEach(function (x) { 
    db.Statistic.update({ _id: x._id }, 
     {$set: { 
     kodoId: NumberInt(x.kodoId) 
     }}); 
}); 

與第二PARAM這將負荷kodoId值(希望從索引)。這應該更快,因爲它不需要加載和重新保存整個文檔 - 只需要一個字段。

+0

如果有些值已經是NumberInt,你可能會在第二個例子中添加一個'try .. catch(err)',因爲它會拋出一個錯誤。 –

+0

對我來說就像一個魅力。謝謝! –

相關問題