knight_ka | 生活及学习笔记

Mongodb高级

目录:
1.文档之间支持多种关系(可以使用数据库变量引用)。
2.mongodb监控mongostat/mongotop
3.数据库备份与恢复(mongodump/mongorestore)
4.覆盖索引查询(提升查询效率):查询出来的字段是索引字段。
5.explain()查询分析。
6.创建高级索引(数组,嵌套子文档索引)
7.索引限制(通过explain进行分析)
8.objectId的更改、使用js函数自增
9.全文检索开启
10.固定集合的大小

文档与文档之间的关系
MongoDB 中的关系可以是:

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

一对一:保存字段address_id 为 address集合中的一个文档的id
一对多:保存字段address_ids 为 address集合中的多个文档的id,数组。

引用可以使用 DBRefs 或 手动引用

DBRef的形式:

{ $ref : , $id : , $db : }
三个字段表示的意义为:

  • $ref:集合名称
  • $id:引用的id
  • $db:数据库名称,可选参数
    以下实例中用户数据文档使用了 DBRef, 字段 address:

{
“_id”:ObjectId(“53402597d852426020000002”),
“address”: {
“$ref”: “address_home”,
“$id”: ObjectId(“534009e4d852427820000002”),
“$db”: “w3cschoolcc”},
“contact”: “987654321”,
“dob”: “01-01-1991”,
“name”: “Tom Benzamin”
}

其它核心API
1.查询分析:explain()

现在,我们看看这个结果集的字段:

  • indexOnly: 字段为 true ,表示我们使用了索引。
  • cursor:因为这个查询使用了索引,MongoDB 中索引存储在B树结构中,所以这是也使用了 BtreeCursor 类型的游标。如果没有使用索引,游标的类型是 BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建,由于存储索引信息,这个稍微会提到)来得到索引的详细信息。
  • n:当前查询返回的文档数量。
  • nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好。
  • millis:当前查询所需时间,毫秒数。
  • indexBounds:当前查询具体使用的索引。

2.使用 hint() 强行使用规定的索引

虽然MongoDB查询优化器一般工作的很不错,但是也可以使用 hint 来强制 MongoDB 使用一个指定的索引。

这种方法某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询(一些字段已经索引了)。

如下查询实例指定了使用 gender 和 user_name 索引字段来查询:

db.users.find({gender:”M”},{user_name:1,_id:0}).hint({gender:1,user_name:1})
可以使用 explain() 函数来分析以上查询:

db.users.find({gender:”M”},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
MongoDB 索引限制

额外开销

每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。

内存(RAM)使用

由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。

如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。

查询限制

索引不能被以下的查询使用:

  • 正则表达式及非操作符,如 $nin, $not, 等。
  • 算术运算符,如 $mod, 等。
  • $where 子句
    所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看。

索引键限制

从2.6版本开始,如果现有的索引字段的值超过索引键的限制,MongoDB中不会创建索引。

插入文档超过索引键限制

如果文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引的集合。与mongorestore和mongoimport工具类似。

最大范围