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



上一篇:点击页面出对应弹窗


下一篇:食物链NOI2001/POJ1182(并查集边带权或扩展域)