上一篇文章中我们讨论了:mongodb覆盖查询、分析查询和原子操作,下面开始讨论mongodb的高级索引、对索引的限制以及了解ObjectId的结构。
一、高级索引考虑以下用户集合的文档:
{
"address": {
"city": "Naplas",
"state": "Italino",
"pincode": "321"
},
"tags": [
"music",
"art",
"story"
],
"name": "Van"
}
上面的文档包含一个地址子文档和一个标记数组。
1、索引数组字段
假设我们希望基于用户的标记tag搜索用户文档,我们需要在集合中的tags数组上创建一个索引。
在数组上创建一个索引,然后为它的每个字段创建单独的索引项。所以在我们的例子中,当我们在tags数组上创建一个索引时,将为它的值music、art和story创建单独的索引。
要在标记tag数组上创建索引,请使用以下代码:
db.users.ensureIndex({"tags":1})
创建索引之后,我们可以像这样搜索集合的tags字段:
db.users.find({tags:"philosophy"})
要验证是否使用了正确的索引,请使用下面的explain命令:
db.users.find({tags:"art"}).explain()
2、索引子文档字段
假设我们希望根据城市、识别码等字段搜索文档。由于所有这些字段都是address子文档字段的一部分,所以我们将在子文档的所有字段上创建一个索引。
要在子文档的所有三个字段上创建索引,请使用以下代码:
db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
创建索引之后,我们可以使用该索引搜索任何子文档字段,如下所示:
db.users.find({"address.city":"Naples"})
记住查询表达式必须遵循指定索引的顺序,因而上面创建的索引将支持以下查询:
db.users.find({"address.city":"a","address.state":"A"})
它还将支持以下查询:
db.users.find({"address.city":"a","address.state":"A","address.pincode":"963"})
二、限制索引额外的开销
每个索引都会占用一些空间,并在每次插入、更新和删除时造成开销。因此如果你很少将集合用于读取操作,那么不使用索引是有意义的。
RAM的消耗
索引存储在RAM里面应确保索引的大小不会超过RAM的限制,若索引大小增加了RAM大小,mongodb会删除一些索引从而导致性能损失。
查询限制
索引不能用于使用下面情况的查询:
- 正则表达式或否定运算符,如$nin、$not等。
- 算术运算符,比如$mod等等。
- $where子句
索引键限制
从2.6版本开始,如果现有索引字段的值超过索引键限制,MongoDB将不会创建索引。
插入超过索引键限制的文档
如果文档的索引字段值超过索引键限制,MongoDB将不会向索引集合插入任何文档,mongorestore和mongoimport实用程序也是如此。
最大范围内
- 一个集合不能有超过64个索引。
- 索引名的长度不能超过125个字符。
- 一个复合索引最多可以索引31个字段。
ObjectId是一个12字节的BSON类型,具有以下结构
- 前4个字节表示自unix标准时间以来的秒数
- 接下来的3个字节是机器标识符
- 接下来的2个字节由进程id组成
- 最后3个字节是一个随机计数器值
1、创建一个新的ObjectId
要生成新的ObjectId,请使用以下代码:
newObjectId = ObjectId()
上面的语句返回了惟一生成的id,你还可以自定义提供一个12字节的id,而不是生成MongoDB的ObjectId。
2、创建文档的时间戳
由于_id ObjectId在缺省情况下存储4字节的时间戳,因此在大多数情况下不需要存储任何文档的创建时间。可以使用getTimestamp方法获取文档的创建时间,这将以ISO日期格式返回此文档的创建时间。
ObjectId("ID").getTimestamp()
3、将ObjectId转换为字符串
【mongodb高级索引、限制索引和ObjectId的结构】在某些情况下,可能需要字符串格式的ObjectId值,要转换字符串中的ObjectId,请使用以下代码,下面代码将返回Guid格式的字符串。
newObjectId.str
推荐阅读
- mongodb高级教程(mapReduce、全文搜索和正则表达式用法详解)
- mongodb覆盖查询、分析查询和原子操作
- mongodb进阶开发教程(数据库关系和引用原理和使用详解)
- 精通php mongodb数据库开发( 增删改查(CRUD)入门操作完整实例详解)
- Java Web数据库开发实战(mongodb增删改查实例详解)
- mongodb高阶(索引创建、聚合查询、复制集、分片、创建备份和部署)
- 如何在一个ng-click指令中添加许多功能()
- 计算从mXn矩阵的左上到右下的所有可能路径
- 算法设计(打印最长的子字符串而不重复字符)