最近在写一个lua的MongoDB模块。MongoDB版本3.2,lua则是5.3.1。底层以C++来写,再把函数暴露给lua调用。但是在lua中打印结果时,发现了些奇怪的现象。首先,数据库中的内容:

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

当然,这是我随手写来测试的,没什么意义。然而在lua中打印是这样的:

table: 0xff0ae0
{
"" = table: 0xfe4800
{
"name" = "kfsjadlfasfkljeihfdsfkasfjslkfjei"
"_id" = 2002.0
"amount" = 78.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:,amount:} )

没有指定任何类型,并且,使用的是json格式。问题就来了:json格式只有number类型,并没有细分int、double之类的数字,那么为了保险起见,显然mongo shell全部把它存为了double类型。官方显然早就注意到了这个问题,允许在shell中输入数据时指定类型,比如:

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

使用NumberInt之类的函数来指定类型。指定之后,在lua中现次查询,结果为:

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

发现数据2009是显示正常的。以后程序运行时,数据是从程序输入的,这也就不成问题。

MongoDB的数据类型的更多相关文章

  1. mongoDB之数据类型

    mongoDB之数据类型 Object  ID :文档的id String: 字符串,最常用,必须是utf-8 Boolean:布尔值,true 或者false Integer:整数 Double:浮 ...

  2. MongoDB 之 数据类型 最无聊! But 最有用! MongoDB - 3

    MongoDB的新篇章开始啦 - 数据类型 https://www.cnblogs.com/xuzhaocai/p/8048177.html 一.MongoDB 之 丰富多彩的数据类型世界 首先我们要 ...

  3. 3,MongoDB之数据类型

    一.MongoDB 之数据类型 首先我们要先了解一下MongoDB中有什么样的数据类型: Object  ID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boo ...

  4. MongoDB - 认识MongoDB及数据类型

    目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必 ...

  5. Mongodb基本数据类型、常用命令之增加、更新、删除

    1.null---表示空值或者该字段不存在,如{"name":null} 2.布尔 --- 和java中的布尔一样,有两种:true,false,如{"sex" ...

  6. mongodb基本数据类型

    本文导读:Mongodb是一种强大,灵活,可扩展的数据存储方式.它扩展了关系型数据库众多有用的功能,如索引,范围查询和排序. MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和 ...

  7. mongodb中数据类型的坑

    在mongodb中,我们给每个文档插入数据的时候,mongodb自动会为我们插入的数据创建数据类型.由于mongodb是一个非结构化的数据存储系统,因此在文档中你可以随意插入不同类型的字段,这和MyS ...

  8. MongoDB的数据类型(四)

    JSON JSON是一种简单的数据表示方式,它易于理解.易于解析.易于记忆.但从另一方面来说,因为只有null.布尔.数字.字符串.数组和对象这几种数据类型,所以JSON有一定局限性.例如,JSON没 ...

  9. mongoDB 其他数据类型

    时间 类型 获取当前时间 new Date() 自动生成当前时间(国际标准时间) db.class.insertOne({book:"数学",date:new Date()}) D ...

随机推荐

  1. HDU -2546饭卡(01背包+贪心)

    这道题有个小小的坎,就是低于5块不能选,大于5块,可以任意选,所以就在初始条件判断一下剩余钱数,然后如果大于5的话,这时候就要用到贪心的思想,只要大于等于5,先找最大的那个,然后剩下的再去用背包去选择 ...

  2. OD: ASLR

    ASLR,Address Space Layout Randomization,通过加载程序的时候不再使用固定的基址,从而干扰 shellcode 定位的一种保护机制,包括映像随机化.堆栈随机化.PE ...

  3. js三种消息框总结-警告框、确认框、提示框

    js消息框类别:警告框.确认框.提示框 警告框:alert("文本"); 确认框:confirm("文本"); 提示框:prompt("文本" ...

  4. (转)asp.net 使用cookie完成记住密码自动登录

     代码如下 复制代码 string username = this.txtUserName.Text;//用户名        string password = this.txtPassword.T ...

  5. 使用Application_Error捕获站点错误并写日志

    Global.ascx页面使用以下方法即可捕获应用层没有try cath的错误 protected void Application_Error(Object sender, EventArgs e) ...

  6. An attempt to attach an auto-named database for file

    在用VS自带的 .mdf读取(joint)时,报错: Server Error in '/' Application. An attempt to attach an auto-named datab ...

  7. Jquery中dialog属性小记

    代码如下: $('#dialogDiv').dialog( { hide:true, //点击关闭是隐藏,如果不加这项,关闭弹窗后再点就会出错. autoOpen:false, height:380, ...

  8. Mysql 5.6 Cmake 编译安装

    MySQL编译安装 环境: OS: CentOS 6.6x64 mini mysql: mysql-5.6.251. mysql 下载: http://dev.mysql.com/downloads/ ...

  9. Eclipse关闭XML文件验证的方法,解决xml警告

    XML的编写是否符合规范,可以通过XML Schema或DTD进行验证,但有时候电脑本来就很卡,而且XML的某些错误并未导致程序无法运行的情况下,暂时关闭XML的验证也算不错的选择. 如web.xml ...

  10. 2014年企业改善IT风险管理的5个办法

    进入新的一年,企业面对数据泄密事故.日益复杂的攻击和对其控制的持续监管,现在是时候重新审视其风险管理战略了.虽然每个企业都是独特的,风险管理专家认为有些风险管理办法值得企业关注.下面我们列出了5个风险 ...