• 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是显示正常的。以后程序运行时,数据是从程序输入的,这也就不成问题。

  • 相关阅读:
    permission 文档 翻译 运行时权限
    TabLayout ViewPager Fragment 简介 案例 MD
    Log 日志工具类 保存到文件 MD
    OkHttp 官方wiki 翻译 MD
    Okhttp 简介 示例 MD
    OkHttp 官方Wiki之【使用案例】
    DialogPlus
    倒计时 总结 Timer Handler CountDownTimer RxJava MD
    RecyclerView 判断滑到底部 顶部 预加载 更多 分页 MD
    CSS3的媒体查询(Media Queries)与移动设备显示尺寸大全
  • 原文地址:https://www.cnblogs.com/coding-my-life/p/5096980.html
Copyright © 2020-2023  润新知