BSON及mongoDB数据类型_moots_的博客-程序员秘密

技术标签: 数据  JavaScript  基础  mongodb  

转自Leshami大佬       原文链接:https://blog.csdn.net/robinson_0612/article/details/52668870

 

    JSON是一种被广泛使用的轻量级的数据交换格式,支持现今绝大多数主流的开发语言。而近几年崛起的mongDB则采用了类JSON的数据格式,在JSON之上进行了丰富和增强,使得mongoDB可以处理及报错更大的数据类型。本文就2者进行描述同时给出mongoDB支持的数据类型。

一、JSON特性

1、什么是JSON
        JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
        JSON采用完全独立于语言的文本格式,但也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。
        这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
        可以详细参考:http://www.json.org.cn/

2、JSON 数据的书写格式
        名称/值对 对象
        是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。
        每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
        如:  ({"firstName":"John"}),更多的格式见本文第而部分BSON支持的数据类型
        等价于这条 JavaScript 语句: firstName="John"

3、JSON仅支持以下数据类型
        数字(整数或浮点数)
        字符串(在双引号中)
        逻辑值(true 或 false)
        数组(在方括号中)
        对象(在花括号中)
        null

4、JSON基于两种结构:
        “名称/值”对的集合(A collection of name/value pairs),在不同的编程语言中有不同的描述
                    如:对象(object),纪录(record),结构(struct),字典(dictionary)
                    哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)
        值的有序列表。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)

 

二、BSON特性

1、什么是BSON
        BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON
        它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
        https://docs.mongodb.com/manual/reference/bson-types/

2、BSON的特性
    轻量性、可遍历性、高效性

3、mongoDB与BSON
        mongoDB对JSON串做了一些增加,使其可以支持更多的数据类型,并且将其作为存储结构
        mongoDB这种格式转化成一文档这个概念(Document),因为BSON是schema-free的,所以在MongoDB中所对应的文档也有这个特征
        mongoDB以BSON做为其存储结构的一种重要原因是其可遍历性

4、演示mongoDB支持的数据类型
//null值

    db.mycol.insert({x:null})
    WriteResult({ “nInserted” : 1 })

//布尔型,用于存储布尔值(真/假)

    db.mycol.insert({x:true})
    WriteResult({ “nInserted” : 1 })

//小数

    db.mycol.insert({x:3.1515})
    WriteResult({ “nInserted” : 1 })

//整数,用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位

    db.mycol.insert({x:3})
    WriteResult({ “nInserted” : 1 })

//4字节带符合整数

    db.mycol.insert({x:NumberInt(“3”)})
    WriteResult({ “nInserted” : 1 })

//8字节带符号整数

    db.mycol.insert({x:NumberLong(“3”)})
    WriteResult({ “nInserted” : 1 })

//字符型,存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的

    db.mycol.insert({x:”robin”})
    WriteResult({ “nInserted” : 1 })

//日期型

    db.mycol.insert({x:new Date()})
    WriteResult({ “nInserted” : 1 })

//正则表达式

    db.mycol.insert({x:/u01/i})
    WriteResult({ “nInserted” : 1 })

//数组,用于将数组或列表或多个值存储为一个键

    db.mycol.insert({x:[“a”,”b”,”c”]})
    WriteResult({ “nInserted” : 1 })

//嵌套文档,用于内嵌文档

    db.mycol.insert({x:{y:”nested”}})
    WriteResult({ “nInserted” : 1 })

//对象id

    db.mycol.insert({x:ObjectId()})
    WriteResult({ “nInserted” : 1 })

//代码段

    db.mycol.insert({x:function(){/This is a test code/}})
    WriteResult({ “nInserted” : 1 })

//查找集合mycol的文档

    db.mycol.find({},{_id:0})
    { “x” : null }
    { “x” : true }
    { “x” : 3.1515 }
    { “x” : 3 } //Author : Leshami
    { “x” : 3 } //Blog : http://blog.csdn.net/leshami
    { “x” : NumberLong(3) }
    { “x” : “robin” }
    { “x” : ISODate(“2016-09-06T02:46:35.173Z”) }
    { “x” : /u01/i }
    { “x” : [ “a”, “b”, “c” ] }
    { “x” : { “y” : “nested” } }
    { “x” : ObjectId(“57ce2f34ce8685a6fd9df3ae”) }
    { “x” : function (){/This is a test code/} }

//undefined类型

    db.mycol.insert({name:undefined});
    WriteResult({ “nInserted” : 1 })
    db.mycol.insert({name:”123”});
    WriteResult({ “nInserted” : 1 })
    printjson(db.mycol.find().toArray())
    [
    {
    “_id” : ObjectId(“57ce1cc8c60f1fe489e49c68”),
    “name” : undefined
    },
    {
    “_id” : ObjectId(“57ce1cdbc60f1fe489e49c69”),
    “name” : “123”
    }
    ]

//查找undefined类型的文档

    db.mycol.find({name:”undefined”})
    db.mycol.find({name:undefined})
    Error: error: {
    “waitedMS” : NumberLong(0),
    “ok” : 0,
    “errmsg” : “cannot compare to undefined”,
    “code” : 2
    }

    db.mycol.find({name:{$type:6}})
    { “_id” : ObjectId(“57ce1cc8c60f1fe489e49c68”), “name” : undefined }

    db.mycol.find({name:{$type:”undefined”}})
    { “_id” : ObjectId(“57ce1cc8c60f1fe489e49c68”), “name” : undefined }

//mongoDB数据类型的比较与排序优先级
1) MinKey (internal type)
2) Null
3) Numbers (ints, longs, doubles)
4) Symbol, String
5) Object
6) Array
7) BinData
8) ObjectId
9) Boolean
10) Date
11) Timestamp
12) Regular Expression
13) MaxKey (internal type)

5、关于_id与Object_Id
mongoDB中每一个文档都必须有一个"_id"键,该键等同于RDBMS中的主键,只不过这个主键是由mongoDB自动生成
"_id"键的值可以使用任意类型,可以不使用系统创建,而由用户自定义的规则生成
"_id"为轻量级,全局唯一,可类比为MySQL数据中的GTID,也用于解决不同机器副本集复制时唯一性问题

a 4-byte value representing the seconds since the Unix epoch,  //时间戳
a 3-byte machine identifier,                                   //机器唯一标识码
a 2-byte process id, and                                       //进程ID
a 3-byte counter, starting with a random value.                //随机数

 

    db.mycol.findOne()
    { “_id” : ObjectId(“57ce2d4cce8685a6fd9df3a3”), “x” : null }
    57ce2d4c //时间戳 ==>1473129804 ==> 2016/9/6 10:43:24
    ce8685 //机器唯一标识码
    a6fd //进程ID
    9df3a3 //随机数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shuzishij/article/details/84139660

智能推荐

linux驱动_uart_uart驱动程序_歌维的博客-程序员秘密

工业物联网关项目linux uart 驱动实现代码分析

sht30温湿度传感器中文手册_【STM32Cube_16】使用硬件CRC校验数据(以SHT30为例)..._weixin_39649660的博客-程序员秘密

寻求更好的阅读体验,请移步Mculover666的个人博客:Mculover666的个人博客​www.mculover666.cn本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件CRC外设校验数据,并用SHT30温湿度传感器为例检查是否可以正确校验。1. 准备工作硬件准备开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):软件准备...

对PDF做笔记和批注_pdf的批注模式拉不到外面去_fzthao的博客-程序员秘密

读论文时,在pdf上做笔记很重要,以前论文和笔记分离的方法不好,形不成追溯,笔记显得更像是读后感。这样不好。单独用‘福昕阅读器’,可以加各种批注,高亮,文本框等,还可以将所加的批注用列表的形式显示,并能搜索。但是,如果pdf文件中空白空间小的话,该方法就有一定局限性了。想写的东西太多,页面放不下,用隐藏的备注能放下,但又有多少人会一个个查看自己隐藏起来的备注呢?后来发现了小软件——

bboss persistent事务管理介绍_yin_bp的博客-程序员秘密

bboss persistent的事务管理框架实现数据库的增、删、改、查事务管理,整个事务管理框架在下面的各节中详细介绍。事务管理框架的实现原理模型见下图:应用程序中的事务TX都会和本地线程关联,本地线程ThreadLocal是一个对上下文Thread关联的线程独占资源进行有效管理的容器。4.9.1.多数据库事务的支持(分布式事务)一个事务中如果存在不同数据库的操作,那么事务的处理

Understanding ELF using readelf and objdump_diy534的博客-程序员秘密

What is ELF? ELF (Executable and Linking Format) is file formatthat defines how an object file is composed and organized. With thisinformation, your kernel and the binary loader know how to loadthe

一些公司的笔试题_alonebar的博客-程序员秘密

一些公司的笔试题 Sony笔试题   1.完成下列程序   *   *.*.   *..*..*..   *...*...*...*...   *....*....*....*....*....   *.....*.....*.....*.....*.....*.....   *......*......*......*......*......*......

随便推点

windows下连接PostgreSQL操作_windows postgres 登录_liuxuefeng521的博客-程序员秘密

版权声明:本文为博主原创文章,未经博主允许不得转载。1、windows下postgresql的安装参见《PostgreSQL从菜鸟到专家 Windows中安装》网址:http://tech.it168.com/a2012/0503/1344/000001344327_all.shtml我下载的为xxx9.2.exe一路默认安装即可。安装位置为C:\Program Files

RAID与LVM磁盘阵列技术_吴蔚�的博客-程序员秘密

RAID:分散读写技术。LVM:硬盘设备资源管理技术。RAID 0:(至少两块)提升读写速度,存储成本无变化,数据安全性下降RAID 1:(至少两块)注重数据安全性,速度无提升,磁盘利用率下降,存储成本提高。RAID 5:(至少三块)读写速度、数据安全性与存储成本的“妥协”。RAID 10:(至少四块)对两个RAID 1 磁盘阵列实施RAID 0 技术,存储成本很高。LVM:(逻辑卷管...

华为、联想等名企笔试题总汇_weixin_33843409的博客-程序员秘密

■华为笔试题1.请你分别画出OSI的七层网络结构图和TCP/IP的五层结构图。 2.请你详细地解释一下IP协议的定义,在哪个层上面?主要有什么作用?TCP与UDP呢 ? 3.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的? 4.请问C++的类和C里面的struct有什么区别? 5.请讲一讲析构函数和虚函数的用法和作用。 6.全局变量和局部变量有什么区别?是怎...

迷宫问题(广度优先搜索)_迷宫问题宽搜_yuzhang_zy的博客-程序员秘密

1. 问题描述:输入:第一行输入迷宫的行与列,第二行输入迷宫输出:走出迷宫的最少步数下面是具体的例子:...1111111111111111111111111111111.111111........1111111111.111111.111111..111.11111111.....111111.11111111111.1111111111.111111...

SpringMVC工作流程与核心组件_ZBH4444的博客-程序员秘密

SpringMVC 的详细工作流程和其中的核心组件介绍。

如何评价 APICloud ?_Wei_Leng的博客-程序员秘密

柚子科技的APICloud限量公测上线,我觉得这个端 + 云的概念挺好,不知道大家怎么看?

推荐文章

热门文章

相关标签