zoukankan      html  css  js  c++  java
  • MongoDB高级知识(六)

    1. document的关系

    多个文档之间在逻辑上可以相互联系,可以通过嵌入和引用来建立联系。

    文档之间的关系可以有:

    • 1对1
    • 1对多
    • 多对1
    • 多对多

    一个用户可以有多个地址,所以是一对多的关系。

    #user document
    {
       "_id":ObjectId("52ffc33cd85242f436000001"),
       "name": "Tom Hanks",
       "contact": "987654321",
       "dob": "01-01-1991"
    }
    
    #address document
    {
       "_id":ObjectId("52ffc4a5d85242602e000000"),
       "building": "22 A, Indiana Apt",
       "pincode": 123456,
       "city": "Los Angeles",
       "state": "California"
    } 

    (1) 嵌入式关联:把用户地址嵌入到用户的文档中

    {
       "_id":ObjectId("52ffc33cd85242f436000001"),
       "contact": "987654321",
       "dob": "01-01-1991",
       "name": "Tom Benzamin",
       "address": [
          {
             "building": "22 A, Indiana Apt",
             "pincode": 123456,
             "city": "Los Angeles",
             "state": "California"
          },
          {
             "building": "170 A, Acropolis Apt",
             "pincode": 456789,
             "city": "Chicago",
             "state": "Illinois"
          }]
    } 

    可以这样查询地址:

    db.users.findOne({"name":"Tom Benzamin"},{"address":1})

    缺点:如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。

    (2) 引用关联:把用户数据文档和用户地址数据文档分开,通过引用文档的 id 字段来建立关系。

    {
       "_id":ObjectId("52ffc33cd85242f436000001"),
       "contact": "987654321",
       "dob": "01-01-1991",
       "name": "Tom Benzamin",
       "address_ids": [
          ObjectId("52ffc4a5d85242602e000000"),
          ObjectId("52ffc4a5d85242602e000001")
       ]
    }

    这种方法需要两次查询,第一次查询用户地址的对象id(ObjectId),第二次通过查询的id获取用户的详细地址信息。

    2. MongoDB ObjectId

    ObjectId 是一个12字节 BSON 类型数据,有以下格式:

    • 前4个字节表示时间戳
    • 接下来的3个字节是机器标识码
    • 紧接的两个字节由进程id组成(PID)
    • 最后三个字节是随机数。

    MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。

    在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。

    MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时。

    时刻与技术进步,每天一点滴,日久一大步!!! 本博客只为记录,用于学习,如有冒犯,请私信于我。
  • 相关阅读:
    常用DOS命令大全2
    常用DOS命令大全1
    2020年3月13日Java面试记录
    MySQL Transaction--Sprint中访问只读从库的设置
    MySQL Transaction--TPS计算规则
    MySQL Inport--导入数据
    MySQL Export--导出数据
    MySQL--InnoDB并发线程控制
    MySQL--线程池(Thread Pool)
    MySQL 5.7--复制延迟监控
  • 原文地址:https://www.cnblogs.com/myitnews/p/11612422.html
Copyright © 2011-2022 走看看