2017-01-26 32 views
1

MongoDB的支持NumberDecimalmongoimport拒絕NumberDecimal類型從v.3.4

我的MongoDB服務器版本:3.4.1,但是當我執行mongoimport shell命令我得到一個錯誤:

Failed: error processing document #7: invalid character 'D' in literal NumberInt or NumberLong (expecting 'I' or 'L')


My json:

{"c":"7E474601-B511-4AD9-B2B8-7E61807F9673","n":"n1","v":NumberDecimal("95")} 

Normal insert exec好的,所以這是mongoimort問題。

db.aaa.insert({"c":"7E474601-B511-4AD9-B2B8-7E61807F9673","n":"n1","v":NumberDecimal("95")}) 
WriteResult({ "nInserted" : 1 }) 

這是爲什麼?你可以幫我嗎?

回答

4

弄清楚正確的extended json格式的一個訣竅是在集合上使用mongoexport實用程序來查看MongoDB本身如何發佈json。

在這種情況下,下面應該工作:

{"c":"7E474601-B511-4AD9-B2B8-7E61807F9673","n":"n1","v":{"$numberDecimal":"95"}}

我mongoimport與服務器版本3.4.1測試這一點,它可以正確導入numberDecimal。

+0

聰明!它工作:)謝謝你的時間! – Barney

1

NumberDecimal("95")不是有效JSON表示。它應該是

{"c":"7E474601-B511-4AD9-B2B8-7E61807F9673","n":"n1","v":95} 

它與蒙戈外殼因爲外殼是一個JavaScript解釋器,把NumberDecimal作爲一個有效的數據類型。

如果需要NumberDecimal數據類型,你需要使用一個驅動程序或蒙戈外殼。

形式是bash shell可以運行這個簡單的腳本:

for i in `cat aaa.json` 
do 
mongo --quiet --eval "db.aaa.insert($i)" 
done 

請注意,這是逐行進行插入和效率不高。

+0

謝謝回答。但是我想把這個數字存儲爲NumberDecimal,而不是默認的Double。 「v」:95將保存爲雙倍。來自示例的正常shell db.aaa.insert可正確插入爲NumberDecimal。我也會有9999999.99999999999999這樣的值,所以我需要NumericDecimal – Barney

+0

'mongoimport',當自動運行JSON文件時,按照JSON規範檢測數據類型。如果你想'NumberDecimal',那麼你需要使用mongo shell或者一個驅動程序。 – ares

+0

好的,所以NumberInt和NumberLong都在json規範中,是嗎?我在問,因爲,正如您在例外中看到的那樣,mongoimport建議我使用它們。所以他們應該沒問題。但爲什麼NumericDecimal不受支持。我想以後它會改變,NumberDecimal是新的,我希望他們很快會更新mongoimport。 – Barney