MongoDB的数据类型
最近在写一个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的数据类型的更多相关文章
- mongoDB之数据类型
mongoDB之数据类型 Object ID :文档的id String: 字符串,最常用,必须是utf-8 Boolean:布尔值,true 或者false Integer:整数 Double:浮 ...
- MongoDB 之 数据类型 最无聊! But 最有用! MongoDB - 3
MongoDB的新篇章开始啦 - 数据类型 https://www.cnblogs.com/xuzhaocai/p/8048177.html 一.MongoDB 之 丰富多彩的数据类型世界 首先我们要 ...
- 3,MongoDB之数据类型
一.MongoDB 之数据类型 首先我们要先了解一下MongoDB中有什么样的数据类型: Object ID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boo ...
- MongoDB - 认识MongoDB及数据类型
目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必 ...
- Mongodb基本数据类型、常用命令之增加、更新、删除
1.null---表示空值或者该字段不存在,如{"name":null} 2.布尔 --- 和java中的布尔一样,有两种:true,false,如{"sex" ...
- mongodb基本数据类型
本文导读:Mongodb是一种强大,灵活,可扩展的数据存储方式.它扩展了关系型数据库众多有用的功能,如索引,范围查询和排序. MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和 ...
- mongodb中数据类型的坑
在mongodb中,我们给每个文档插入数据的时候,mongodb自动会为我们插入的数据创建数据类型.由于mongodb是一个非结构化的数据存储系统,因此在文档中你可以随意插入不同类型的字段,这和MyS ...
- MongoDB的数据类型(四)
JSON JSON是一种简单的数据表示方式,它易于理解.易于解析.易于记忆.但从另一方面来说,因为只有null.布尔.数字.字符串.数组和对象这几种数据类型,所以JSON有一定局限性.例如,JSON没 ...
- mongoDB 其他数据类型
时间 类型 获取当前时间 new Date() 自动生成当前时间(国际标准时间) db.class.insertOne({book:"数学",date:new Date()}) D ...
随机推荐
- Java基础知识强化87:BigInteger类之BigInteger加减乘除法的使用
1. BigInteger加减乘除法的使用 public BigInteger add(BigInteger val):加 public BigInteger subtract(BigInteger ...
- mysql 创建数据库使用默认字符集(备忘)
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...
- memcache和memcached
一:Memcached.memcached.memcache. 其中首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储数据的“数据库” ...
- memcache缓存命中深入理解转载
http://www.iteye.com/topic/225692 memcache的方法有 add,set,replace,get,delete,getstats,increment,decreme ...
- repeater 结合checkbox批量删除
项目中用到这个,从网上搜了搜相关内容,代码如下 <script type="text/javascript"> function checkAllThis(obj) { ...
- SqlServer 查看数据库锁,解除锁,此种情况一般常见都是由于事务所造成
检查数据库锁 SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableNameFROM sys.dm ...
- 【转】Windows按键消息—虚拟键码
来源:http://c.biancheng.net/cpp/html/1253.html 虚拟键码保存在WM_KEYDOWN.WM_KEYUP.WM_SYSKEYDOWN和WM_SYSKEYUP消息的 ...
- setTimeout(fn, 0)引发的JavaScipt线程的思考
起因 周五改一个checkbox的display属性被错误地设置为none的bug. 经debug发现, 有两个地方修改了display属性: 1) checkbox的controller; 2) c ...
- Linux下动态链接库和静态链接库
第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...
- oldboy第三天学习
一.上课体验及感受 额第三天了.身心疲惫.上课一脸懵逼,是最标准的诠释.三个星期的疲惫感,更深了.很难,但是还要继续 写好作业.吸收知识. 二.三级列表 menu = { '北京':{ '海淀':{ ...