zoukankan      html  css  js  c++  java
  • MongoDB 文档间的关系

    文档间可以通过嵌入和引用来建立联系。MongoDB 中的关系可以是:

    • 1:1 (1对1)

    • 1: N (1对多)

    • N: 1 (多对1)

    • N: N (多对多)

    嵌入式关系

    这种数据结构的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能

    文档嵌套的数量和深度没有限制,但MongoDB目前版本限制一个文档最大为16MB

    {
      "name": "Tom",
      "address": [
        {
            "city": "Los Angeles"
        },
        {
            "city": "Chicago"
        }]
    }

    只需要查询一次

    db.relation.find(
    {"name":"tom"},{"address":1,"_id":0}
    )

    引用式关系

    手动引用

    引用式关系是设计数据库时经常用到的方法,这种方法把用户数据文档和用户地址数据文档分开,通过引用文档的 id 字段来建立关系

    {
       "name":"jack",
    "address_id":[
      ObjectId("5fcda6c686463b86f2650f78"),ObjectId("5fcda6d086463b86f2650f79")
      ]  
    }

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

    var result=db.relation.findOne({"name":"jack"},{"address_id":1})
    db.relation.find({"_id":{"$in":result["address_id"]}})

    DBRefs

    DBRef的形式:

    { $ref : , $id : , $db :  }

    三个字段表示的意义为:

    • $ref:集合名称

    • $id:引用的id

    • $db:数据库名称,可选参数

    {
       "name":"hjy",
       "address":{
           "$db":"test1",
           "$ref":"relation",
           "$id":ObjectId("5fcda6d086463b86f2650f79")
          }
    }

    DBRef的查询

    var user=db.hjy.findOne({"name":"hjy"})
    var add=user.address
    db[add.$ref].findOne({"_id":add.$id})



  • 相关阅读:
    bzoj4358: permu
    bzoj4636: 蒟蒻的数列
    bzoj4229: 选择
    bzoj4561: [JLoi2016]圆的异或并
    bzoj2618: [Cqoi2006]凸多边形
    bzoj1803: Spoj1487 Query on a tree III
    bzoj2467: [中山市选2010]生成树
    PostgreSQL服务器存储参数的内部查看方法和实际表述之间的关系
    PostgreSQL 系统表
    PostgreSQL环境中查看SQL执行计划示例
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164242.html
Copyright © 2011-2022 走看看