Dawn's Blogs

分享技术 记录成长

0%

MongoDB学习 (4) 索引和关系引用

索引

MongoDB 支持建立索引,索引可以建立在一个或者多个字段上。并且由于索引是在内存中的,所以查询效率很高。但是在写操作时,由于还需要维护索引,所以写操作的效率会有所降低。

MongoDB 索引的数据结构是 B 树

索引覆盖查询

索引覆盖查询就是之间在索引上查询并返回结果,不需要在磁盘上扫描结果。索引覆盖查询需要满足以下条件:

  • 索引字段包含了查询条件中的所有字段。
  • 查询条件中只包含索引字段,不包含其他字段。
  • 查询结果只需要索引字段的值,不需要其他字段的值。
1
2
3
4
// users有三个字段name,gender,email
// 在name和gender字段上建立索引
// 仅仅查询gender字段,没有排除_id,查询就不会被覆盖
db.users.find({gender:"M"},{user_name:1,_id:0})

对于索引覆盖查询来说,不会去数据库文件中去查找,而是在索引中直接提取数据

关系

在 MongoDB 中,可以表示一对一、一对多、多对一、多对多关系。

对于一对多关系,可以有两种方法:

  • 嵌入完整的文档:在更新时需要非常的小心,需要同时更新所有嵌入的完整文档。同时冗余数据多,数据量不断变大,会影响读写性能。
  • 关系引用:通过引用文档的 _id 字段来建立关系。也就是说,MongoDB 支持在文档中引用其他文档。

引用

在 MongoDB 中,数据库引用有两种方式:手动引用和DBRefs。

手动引用就是直接去在对应的字段中记录 _id 信息。

DBRefs 的形式为 { $ref : , $id : , $db : }。三个字段表示的意义如下:

  • $ref:集合名称。
  • $id:引用的 _id。
  • $db:引用的数据库名称,可选参数。

因为 DBRefs 可以指定引用的 id 和数据库名称,所以更加相比于手动引用更加规范和灵活。