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

时间: 2024-12-16 16:34:34

MongoDB的数据类型的相关文章

mongoDB之数据类型

mongoDB之数据类型 Object  ID :文档的id String: 字符串,最常用,必须是utf-8 Boolean:布尔值,true 或者false Integer:整数 Double:浮点数 Arrays:数组或者列表,多个值存储到一个键 Object:用于嵌入文档,即一个值为一个文档 Null:存储null值 Timestamp:时间戳 Date:存储当前日期或时间unix时间格式 Object ID: 每个文档都有一个属性,为_id保证文档的唯一性: 可以自己去设置_id插入文

MongoDB 之 数据类型

一.MongoDB的数据类型 Object  ID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (Python中 True False 首字母大写) Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) Double:浮点数 (没有float类型,所有小数都是Double) Arrays:数组或者列表,多个值存储到一个键 Object:如果你学过Python的话,

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

一.MongoDB 之 丰富多彩的数据类型世界 首先我们要先了解一下MongoDB中有什么样的数据类型: Object  ID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写) Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) Double:浮点数 (没有float类型,所有小数都是Doubl

3,MongoDB之数据类型

MongoDB的新篇章开始啦 - 数据类型 https://www.cnblogs.com/xuzhaocai/p/8048177.html 一.MongoDB 之 丰富多彩的数据类型世界 首先我们要先了解一下MongoDB中有什么样的数据类型: Object  ID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写) Integer:整数 (

MongoDB的数据类型(四)

JSON JSON是一种简单的数据表示方式,它易于理解.易于解析.易于记忆.但从另一方面来说,因为只有null.布尔.数字.字符串.数组和对象这几种数据类型,所以JSON有一定局限性.例如,JSON没有日期类型,JSON只有一种数字类型,无法区分浮点数和整数,更别说区分32为和64位数字了.再者,JSON无法表示其他一些通用类型,如正则表达式或函数. BSON BSON(Binary Serialized Document Format)是一种类JSON的二进制形式的存储格式,简称Binary

MongoDB的数据类型介绍

参考MongoDB官网:https://docs.mongodb.com/manual/reference/bson-types/ MongoDB文档存储是使用BSON类型,BSON(BSON short for Bin-ary JSON, is a bin-ary-en-coded seri-al-iz-a-tion of JSON-like doc-u-ments)是二进制序列化的形式.类如JSON,同样支持内嵌各种类型. Type Number Alias Notes Double 1 "

MongoDB修改数据类型

如果类型写入错误,可以通过下面的方式在命令行中修改之. db.jobtracker_data.find({'collect_time' : { $type : 2 }}).forEach(function(x) { x.collect_time = parseInt(x.collect_time); db.jobtracker_data.save(x); }) 本来collect_time字段的值应该是long long,结果不小心变成了string.上面的命令行用$type 为2查找凡是col

MongoDB入门学习(二):MongoDB的基本概念和数据类型

上一篇讲了MongoDB的安装和管理,其中涉及到了一些概念,数据结构还有一些API的调用,不知道的没关系,其实很简单,这篇会简单介绍一下. 1.文档 文档是MongoDB的核心概念,多个键值对有序的放在一起就是一个文档,文档是MongoDB存储数据最基本的数据结构.对MongoDB都是以文档的形式来操作的,使用了一种类似JSON的二进制BSON数据格式,对API的调用都是传的文档参数.每种编程语言都有标示文档的数据结构,比如java的map,lua的table,python的dict等等,但是都

MongoDB 2.0 认识mogodb及其数据类型

目录 MongoDB - 认识MongoDB及数据类型 启动 MogoDB的数据 MogoDB的数据类型 1.Object ID : Documents自生成的_id 2.string : 字符串,必须是utf-8 3.Boolean : 布尔值,true 或者false(小写) 4.Integer : 整数(int32 int64) 5.Double : 浮点数(没有float类型, 所有小数都是Double) 6.Arrays : 数组或者列表, 多个值存储到一个键(类似list) 7.Ob