MongoDB 关系

MongoDB 的关系表示多个文档之间在逻辑上的相互联系。

文档间可以通过嵌入和引用来建立联系。

MongoDB 中的关系可以是:

  • 1:1 (1对1)
  • 1: N (1对多)
  • N: 1 (多对1)
  • N: N (多对多)

接下来我们来考虑下用户与用户地址的关系。

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

以下是 user 文档的简单结构:

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

以下是 address 文档的简单结构:

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

嵌入式关系

使用嵌入式方法,我们可以把用户地址嵌入到用户的文档中:

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

注意:以上查询中 db 和 users 表示数据库和集合。

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

引用式关系

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

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

以上实例中,用户文档的 address_ids 字段包含用户地址的对象id(ObjectId)数组。

我们可以读取这些用户地址的对象id(ObjectId)来获取用户的详细地址信息。

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

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})
时间: 2024-10-14 11:43:23

MongoDB 关系的相关文章

MongoDB关系与数据库引用

MongoDB关系: MongoDB 的关系表示多个文档之间在逻辑上的相互联系.文档间可以通过嵌入和引用来建立联系. 1. 嵌入关系: 形式:把一个文档嵌入到另一个文档中. 优点:数据保存在单一的文档中,可以比较容易的获取和维护数据.(只需一次查询) 缺点:如果数据量不断变大,会影响读写性能. 使用示例: { "_id":ObjectId("52ffc33cd85242f436000001"), "name": "Tom Benzami

mongodb 关系、引用、覆盖索引查询

一.关系 MongoDB 的关系表示多个文档之间在逻辑上的相互联系.文档间可以通过嵌入和引用来建立联系.MongoDB 中的关系可以是:1对1,1对多,多对1,多对多. 一个用户可以用多个地址,这是典型的一对多关系. user文档可以是: { "_id":ObjectId("52ffc33cd85242f436000001"), "name": "Tom Hanks", "contact": "9

MongoDB 8关系

p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "He

mongodb 初学 目录

mongodb 初学 索引 啦啦啦 MongoDB 教程 NoSQL 简介 MongoDB 简介 Windows 平台安装 MongoDB Linux平台安装MongoDB mongodb 在 Ubuntu系统上的安装及卸载 Mongodb启动命令mongod参数说明 Mac OSX 平台安装 MongoDB MongoDB 概念解析 MongoDB - 连接 MongoDB 创建数据库 MongoDB 删除数据库 MongoDB 插入文档 MongoDB 更新文档 MongoDB 删除文档 M

【缓存\性能】HTML5缓存的那些事

更多前端文章:http://lvtraveler.github.io/ 关于存储 说到存储,你可能会想到这是服务器端的一种设置. 服务器端的存储介质大体上分为4种: cache:缓存,它可以让从数据库.磁盘上输出的东西/数据放置在缓存里,从而减少数据库或是磁盘的读取与写入(IO)操作: 磁盘文件:如,我们常常会将图片.视频等文件存放在磁盘上: 数据库:mySql\mongoDB-关系\非关系数据库: 内存:通常放置频繁要使用到的东西,能够提高读取效率:缓存(cache)也是存放在内存里的: HT

我的MongoDB-基础笔记

mongoDB 知识点小结 1.ObjectId  12位 4时间戳+3机器识别吗+2进程id+3个随机数 getTimestamp() str() 2.Map Reduce 将大批量的工作分解执行,然后将结果合并成最终的结果. 3.MongoDB全文检索 创建索引:db.posts.ensureIndex({post_text:"text"}) 使用全文检索:db.posts.find({$text:{$search:"runoob"}}) 删除全文索引: db.

SpringData,JPA,MongoDB,Solr,Elasticsearch底层逻辑关系

一: Spring-data底层的接口路基: spring-data : PagingAndSortingRepository-> CrudRepository-> Repository ,它是springdatajpa,solr,mongoDB,Elasticsearch的核心基础. 有三个主要的接口: 1. Repository<T, ID> {}空接口 2.CrudRepository<T, ID>extends Repository<T, ID> 主

关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用

关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用 标签: redismongodbfloatshardingfunction测试 2012-05-23 15:17 32842人阅读 评论(9) 收藏 举报  分类: memcache redis 版权声明:本文为博主原创文章,未经博主允许不得转载. 先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然

MongoDB 一对多关系建模

本篇博客翻译自: http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1?mkt_tok=3RkMMJWWfF9wsRonsq7Ldu%2FhmjTEU5z14uUsUKGxhokz2EFye%2BLIHETpodcMTcVnM7zYDBceEJhqyQJxPr3FLdcN0tJuRhTrCw%3D%3D 备注:本译文不是严格意义上的翻译,仅仅是在基于对该原文的理解之上,