zoukankan      html  css  js  c++  java
  • MongoDB入门教程三[数据类型]

    MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、32位数字、64位数字等类型。以下对mongoDB的类型进行简要说明:
     
    1、 Null[类型编号:10]
    null类型用于表示空值或不存在的字段,如:{“x”:null}
     
    2、 布尔类型 Boolean[类型编号:8]
    布尔类型有两上值,’true’和’false’ ,如:{“x”:true}
     
    3、 32位整数 32-bit integer[类型编号:16]
    在由于mongoDB的控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义;
     
    4、 64位整数 64-bit integer[类型编号:18]
    64位整数与32位整数一样,在MongoDB控制台使用时,会转义成64位浮点数。除外,如果数据库本身存储的数据类型无论是32位整数还是64位整数,使用MongoDB控制台获取后,更改其文档记录(即使没有修改整数本身,只修改了文档的其他部分),并重新使用控制台写回数据库,则其数据类型也会变成了64位浮点数。
    除外,使用控制台查看一个64位整数时,可能会不正确定,原因是有些64位的整数不能精确表示为64位浮点数,而控制台呈示都是64位浮点数。
     
    5、 数值类型:Double[类型编号:1]

    在Mongo shell中,默认使用64位浮点型数据。因此,会有以下两种数值形式:

    {"x" : 2.32}
    //或
    {"x" : 2}

    对于整数类型,可以使用NumberInt()(位有符号整型)或NumberLong()(8位有符号整型)方法进行转换。示例如下:

    {"x" : NumberInt(2)}
    {"x" : NumberLong(2)}
     
    6、 字符串类型:String[类型编号:2]
    MongoDB中字符串类型使用UTF-8编码的字符表示。如:{“x”:”Hello QuickCodes”}
     
    7、 符号 Symbol [类型编号:14]
    在MongoDB控制台中不支持这种类型,将自动转义成字符串;
     
    8、 对象id Object id[类型编号:7]
    对象id是文档中唯一的12位的ID ,
    在MongoDB来存储文档时,必须有一个“_id”键,这个键可以是任何类型,如果在增加文档时,没有这个_id键,则系统会使用ObjectId对象自动生成一个,在分布式环境中,不同的机器都能用全局唯一的同种方法来生成值,如:{"_id": ObjectId("57110709d1db0802a433a03c")}
    其生成规则为:
    0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
         时间戳     |     机器   |   PID |    计数器
    前4位表示时间戳,时间戳以秒为单位,由于时间戳在前面,可以更好地反映出数据插入时的时间顺序,使的数据更容易查询,建议索引更加容易。
    虽然系统会自动创建_id键,但在高并发的应用下建议使用客户端的驱动程序来创建,主要原因是,尽管ObjectId可以生成,但是系统在生成时,还是会产生开销,增加数据库的负担。
    在高并发的分布式环境中,只使用以秒为单位的时间戳和机器不能区分其唯一性,故在其后面添加了PID,即MongoDB的进程标识符,前9个字符保证了同一秒钟不同机器不同进程产生的ObjectId是唯一,两位是一个自动递增的计数器,确保相同进程同一秒产生的ObjectId也不一样。

    相关函数:ObjectId()、getTimestamp()、valueOf()

     
    9 日期 Date [类型编号:9]
    MongoDB中日期使用时间戳表示,单位为毫秒,不存储时区。 从标准纪元开始的毫秒数 { “date”:new Date()}
    创建日期对象时应该使用new Date(),而非构造函数Date()。将构造函数作为函数时返回的日期格式是字符串,而非日期对象(与JavaScript工作机制有关)。
    • MongoDB中,日期类型是一个64位的整数,它代表的是距Unix epoch的毫秒数
    • MongoDB在存储时间时,先转化为UTC时间

                                北京时间(CST) = UTC + 8个小时

    • MongoDB Shell中可以使用new Date或ISODate来创建时间对象,在进行显示时,Shell会根据本地时间去设置显示日期对象
    10 正则表达式 Regular Expression[类型编号:11]
    文档中可以包含正则表达式,遵循 JavaScript 的语法。主要用于查询,使用正则表达式作为限定条件

    例如:{name:/foo/  }    name字段含有foo的文档

             {name:/foo/i }    name字段含有foo的文档,且不区分大小写

             {name:/^foo/i }  name字段以foo开头,且不区分大小写

    11 代码 JavaScript(Scope)[类型编号:15]
    MongoDB的文档和代码中可以包括JavaScript代码。如:
    {"x" : function(){ /*这里是一段JavaScript代码*/}}
     
    12二进制数据 Binary data[类型编号:5]
    可以保存由任意字节组成的字符串,例如:图片、视频等。任意字节的二进制串组成, shell 不支持 。二进制数据是一个二进制字节的字作串,要保存非UTF-8字符到数据库中,只能使用十进制数据。
     
    13 最大值 Max Key [类型编号:127]
    表示可能的最大值, shell 不支持
     
    14 最小值 Min Key[类型编号:255]
    表示可能的最小值, shell 不支持
     
    15 未定义 undefined
    { “x”: undefined}
     
    16 数组 Array[类型编号:4]
    数据集可以用数组格式存储,与JavaSript中的数组表示相同。如:
    {"x" : ["cloudev.top", "QuickCodes.Net"]}
    数组中可以包含不同类型的数据元素,包括内嵌文档和数组等。所有MongoDB中键-值对支持的数据类型都可以用做数组的值。
    • 数组是使用方括号来表示的一组值,它既可以作为有序对象(列表、栈、队列),也能作为无序对象(如集合)来操作  
    • 数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)                 例如:[ 3.14,"hello",[1,2,3] ,{"key":"MongoDB"} ]
    • 针对数组MongoDB提供了许多特定的操作符,例如:$push,$pop,$pull,$slice,$addToSet等
    • MongoDB 可自动的为数组元素建立Multikey 索引
     
    17内嵌文档
    文档可以作为文档中某个 key 的value。在MongoDB文档总大小限制为16MB,建议使用子文档的形式组织数据,子文档查询效率要高于多键查询。

    {

           "_id": ObjectId("57110709d1db0802a433a03c"),

          title:"Hello QuickCodes",

          author:"Mac.Manon",

          comments:[

           {nickname:"Peter",comment:"Ok"},

           {nickname:"Tom",comment:"Dig"} ]

    }

    文档可以做为键的值,即:内嵌文档。MongoDB与关系型数据库相比,最大的优势就是内嵌文档。与关系型数据库的扁平化数据结构相比,使用内嵌文档可以数据的组织方式更加自然。

     18.时间戳 Timestamp [类型编号:17]

    时间戳类型有两部分组成:32 bit-Unix epoch 和 32 bit-自增序数(同一秒)

    Timestmp 只供MongoDB 数据库服务内部使用,用于记录操作的详细时间;

    Timestamp 类型和Date类型是没有关系的,对于我们来说使用更多的Date类型;

    相关函数:Timestamp()

     
     
    上述数据类型,均有一个类型编号,如字符串型的类型编号为2,下面的指令会在user表查找字段名称为name,且数据保存为字符串格式的数据:

    db.user.find({name:{$type:2}})

    -----------------------------------------------------------------
    专注App快速开发,欢迎关注微信公众号"App快速开发"。
  • 相关阅读:
    Mybatis实现数据的增删改查(CRUD)
    Spring MVC基础入门
    Swap in C C++ C# Java
    java和c#使用hessian通信
    基于Netty4的HttpServer和HttpClient的简单实现
    RabbitMQ的几种典型使用场景
    java多线程编程
    singleton pattern的推荐实现
    python多线程编程
    基于GMap.Net的地图解决方案
  • 原文地址:https://www.cnblogs.com/quickcodes/p/5397433.html
Copyright © 2011-2022 走看看