美文网首页后端相关
MongoDB 数据类型/插入文档(四)

MongoDB 数据类型/插入文档(四)

作者: simuty | 来源:发表于2017-03-09 15:40 被阅读293次

    第一部分 BJSON 与 JSON

    MongoDB的文档与JavaScript中的对象相似,JavaScript中的数据交互格式是JSON格式.

    JSON的数据格式:

    1. null;
    2. 布尔;
    3. 数字;
    4. 字符串;
    5. 数据;
    6. 对象。
    

    那么我们一直所说的JSON代表的究竟是什么❓
    Mongodb所谓的相似的的格式什么❓

    1.1 JSON 是什么❓

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,以文字为基础,且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立语言文本格式.

    JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是.json。

    JSON建构于两种结构:

    1. 对象(object):一个对象以“{”开始,并以“}”结束。一个对象包含一系列非排序的名称/值对,每个名称/值对之间使用“,”分区。
    2. 名称/值(collection):名称和值之间使用“:”隔开,一般的形式是:{name:value}
    
    
    1.2 BJSON

    BSON( Binary Serialized Document Format)(Binary JSON)是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性可遍历性高效性的特点,可以有效描述非结构化数据结构化数据

    BJSON 分类

    1. String:字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
    2. Integer:整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
    3. Boolean:布尔值。用于存储布尔值(真/假)。
    4. Double:双精度浮点值。用于存储浮点值。
    5. Min/Max keys:将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
    6. Arrays:用于将数组或列表或多个值存储为一个键。
    7. Timestamp:时间戳。记录文档修改或添加的具体时间。
    8. Object:用于内嵌文档。
    9. Null:用于创建空值。
    10. Symbol:符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
    11. Date:日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
    12. Object ID:对象 ID。用于创建文档的 ID。
    13. Binary Data:二进制数据。用于存储二进制数据。
    14. Code:代码类型。用于在文档中存储 JavaScript 代码。
    15. Regular expression:正则表达式类型。用于存储正则表达式。
    
    

    第二部分 插入文档

    当执行插入的时候,使用的驱动程序会将数据装换成BJSON形式,然后插入进数据库.

    2.1 插入文档

    MongoDB提供了如下方法向集合插入 documents :

    1. db.collection.insertOne()
    2. db.collection.insertMany()
    3. db.collection.insert()
    

    实例代码

    
    > db.users.insertOne(
    ...    {
    ...       name: "sue",
    ...       age: 19,
    ...       status: "P"
    ...    }
    ... )
    {
        "acknowledged" : true,
        "insertedId" : ObjectId("5871f4958aebfde452a9207e")
    }
    
    
    > db.users.insertMany(
    ...    [
    ...      { name: "bob", age: 42, status: "A", },
    ...      { name: "ahn", age: 22, status: "A", },
    ...      { name: "xi", age: 34, status: "D", }
    ...    ]
    ... )
    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("5871f49e8aebfde452a9207f"),
            ObjectId("5871f49e8aebfde452a92080"),
            ObjectId("5871f49e8aebfde452a92081")
        ]
    }
    
    
    
    > db.users.insert(
    ...    {
    ...       name: "sue",
    ...       age: 19,
    ...    }
    ... )
    WriteResult({ "nInserted" : 1 })
    > 
    
    

    第三部分 文档中的ObjectId解析

    不论是我们插入文档还是筛选数据, 都会有个_id字段, value 为 ObjectId("5871f4958aebfde452a9207e"),那么这个24位的字符串究竟什么东西?

    > db.users.find()
    { "_id" : ObjectId("5871f4958aebfde452a9207e"), "name" : "sue", "age" : 19, "status" : "P" }
    
    

    为了考虑分布式,“_id”要求不同的机器都能用全局唯一的同种方法方便的生成它。因此不能使用自增主键(需要多台服务器进行同步,既费时又费力),因此选用了生成ObjectId对象的方法。
    实际上它是由一组十六进制的字符构成,每个字节``两位十六进制数字,总共用了12字节的存储空间。

    屏幕快照 2017-01-09 上午9.47.27.png
    1. 时间戳: 前四个字节,也就是前八位--5871f495,转为十进制--1483863189, 
    2. 机器ID: 机器主机名的散列值, 确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。
    3. PID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,
    4. 计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“36236b”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。
    5. 
    

    参考
    BSON及mongoDB数据类型的详解介绍
    BSON与JSON的区别
    BSON
    MongoDB文档(Document)全局唯一ID的设计思路
    MongoDB深究之ObjectId

    更多精彩内容请关注“IT实战联盟”哦~~~


    IT实战联盟.jpg

    相关文章

      网友评论

        本文标题:MongoDB 数据类型/插入文档(四)

        本文链接:https://www.haomeiwen.com/subject/faowgttx.html