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})



  • 相关阅读:
    轮循与连接
    ps中锯齿问题的解决方法
    Linux+Apache+MySQL+PHP安装
    Map map=new HashMap()与HashMap map=new HashMap()的区别
    wdcp常用工具及命令集
    ecshop调试
    纯净版CentOS64位安装LAMP的时候出现的问题总结
    Alertmanager配置webhook
    一个Repeater排序用的控件
    一道面试题模拟实现简易的移动用户资费统计系统逻辑
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164242.html
Copyright © 2011-2022 走看看