MongoDB的數據類型


  最近在寫一個lua的MongoDB模塊。MongoDB版本3.2,lua則是5.3.1。底層以C++來寫,再把函數暴露給lua調用。但是在lua中打印結果時,發現了些奇怪的現象。首先,數據庫中的內容:

> db.item.find()
{ "_id" : 2001, "amount" : 999 }
{ "_id" : 2002, "amount" : 78, "name" : "kfsjadlfasfkljeihfdsfkasfjslkfjei" }

當然,這是我隨手寫來測試的,沒什么意義。然而在lua中打印是這樣的:

table: 0xff0ae0
{
    "1" = table: 0xfe4800
    {
        "name" = "kfsjadlfasfkljeihfdsfkasfjslkfjei"
        "_id" = 2002.0
        "amount" = 78.0
    }
    "0" = table: 0xfe4610
    {
        "amount" = 999.0
        "_id" = 2001.0
    }
}

數據是正確的,問題在於:像2001這些整形數字為什么都有了小數點。稍微跟蹤一下代碼,就可以發現:從MongoDB find出來的數據,已經是double,因此在返回lua層時使用了lua_pushnumber而不是lua_pushinteger,才導致lua認為該數字為number而不是integer。小數點就是這么來的。

  然而MongoDB的數據是基於bson的,而bson是有int類型的。那么,說明數據在輸入MongoDB時類型就已經是double了。而數據是我在mongo shell中輸入的,問題就得從mongo shell查起。

  在官網https://docs.mongodb.org/v3.0/core/shell-types/中提到,mongo shell是有類型的。但我們在輸入時,一般是這樣輸入的:

 db.item.insert( {_id:2002,amount:78} )

沒有指定任何類型,並且,使用的是json格式。問題就來了:json格式只有number類型,並沒有細分int、double之類的數字,那么為了保險起見,顯然mongo shell全部把它存為了double類型。官方顯然早就注意到了這個問題,允許在shell中輸入數據時指定類型,比如:

db.item.insert( {_id:NumberInt(2009),amount:78,name:"kfsjadlfasfkljeihfdsfkasfjslkfjei"} )

使用NumberInt之類的函數來指定類型。指定之后,在lua中現次查詢,結果為:

table: 0xff0ae0
{
    "2" = table: 0xfe5cd0
    {
        "name" = "kfsjadlfasfkljeihfdsfkasfjslkfjei"
        "_id" = 2009
        "amount" = 78.0
    }
    "1" = table: 0xfe4800
    {
        "name" = "kfsjadlfasfkljeihfdsfkasfjslkfjei"
        "_id" = 2002.0
        "amount" = 78.0
    }
    "0" = table: 0xfe4610
    {
        "amount" = 999.0
        "_id" = 2001.0
    }
}

發現數據2009是顯示正常的。以后程序運行時,數據是從程序輸入的,這也就不成問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM