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

  • 相关阅读:
    贝叶斯在机器学习中的应用(一)
    使用ajax发送的请求实现页面跳转
    关于welcom-file-list 失效
    在新的线程中使用session 出现的问题
    关于innerHtml= 与 html() 区别
    request.getAttribute()和 request.getParameter()有何区别?
    __STL_VOLATILE
    声明一个返回特定类型函数指针的函数
    关于vue的基础概念
    Vue.js结合vue-router和webpack编写单页路由项目
  • 原文地址:https://www.cnblogs.com/coding-my-life/p/5096980.html
Copyright © 2011-2022 走看看