MongoDB的數據類型

jopen 8年前發布 | 9K 次閱讀 MongoDB Lua NoSQL數據庫

最近在寫一個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是顯示正常的。以后程序運行時,數據是從程序輸入的,這也就不成問題。

來自: http://www.cnblogs.com/coding-my-life/p/5096980.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!