MongoEngine – 索引
一个有索引的集合会使查询的处理更快。默认情况下,每个集合都会自动在_id字段上建立索引。此外,你可以在一个或多个字段上创建索引。
使用Compass,我们可以非常容易地建立索引。点击索引标签上的CREATE INDEX按钮,如下图所示
一个对话框出现,如图所示。选择索引的名称,索引的字段,索引的顺序(升序或降序)和其他选项。
当使用MongoEngine时,索引是通过在Document类定义的元字典中指定’indexes’键来创建。
indexes属性的值是一个字段的列表。在下面的例子中,我们要求根据姓名字段对学生集合中的文档进行索引。
from mongoengine import *
con=connect('mydata')
class student(Document):
name=StringField(required=True)
course=StringField()
meta = {'indexes':['name']}
s1=student()
s1.name='Avinash'
s1.course='DataScience'
s1.save()
s2=student()
s2.name='Anita'
s2.course='WebDesign'
s2.save()
默认情况下,索引顺序是升序。顺序可以通过前缀’+’来指定升序,或者’-‘来指定降序。
要创建复合索引,使用一个字段名的元组,可以选择附加 “+”或”-“符号来表示排序顺序。
在下面的例子中,学生文档类包含了对姓名和课程的复合索引的定义(注意,课程字段前有-符号,这意味着索引是按姓名升序和课程降序建立的。
from mongoengine import *
con=connect('mydata')
class student(Document):
name=StringField(required=True)
course=StringField()
meta = {'indexes':[('name','-course')]}
s1=student()
s1.name='Avinash'
s1.course='DataScience'
s1.save()
s2=student()
s2.name='Anita'
s2.course='WebDesign'
s2.save()
MongoDB Compass将显示索引,如下图所示
indexes “的值可以是各种选项的字典,如下所示
fields | 要索引的字段。 |
---|---|
cls | 如果allow_inheritance被打开,你可以配置该索引是否应该自动添加_cls字段。 |
sparse | 索引是否应该是稀疏的。 |
unique | 该索引是否应该是唯一的。 |
expireAfterSeconds | 通过设置以秒为单位的时间,自动使数据从一个集合中过期。 |
name | 允许你为该索引指定一个名称 |
collation | 允许创建不区分大小写的索引 |
下面的例子在名字字段上创建索引,3600秒后失效。
from mongoengine import *
con=connect('mydata')
class student(Document):
name=StringField(required=True)
course=StringField()
meta = {'indexes':[{
'fields': ['name'],
'expireAfterSeconds': 3600
}
]
}
要指定文本索引,在字段名前加上’$’符号,对于散列索引,使用’#’作为前缀。
这样指定的索引会在文档被添加到集合中时自动创建。要禁止自动创建,在元属性中设置 ‘auto_create_index ‘为False。
我们在Document类中有 list_indexes() 方法,可以显示可用索引的列表。
print (student.list_indexes())
[[('name', 1)], [('_id', 1)]]
要在一个不在元字典中的字段上创建索引,请使用 create_index() 方法。下面的代码将在课程字段上创建索引 —
class student(Document):
name=StringField(required=True)
course=StringField()
meta = {'indexes':[{
'fields': ['name'],
'expireAfterSeconds': 3600
}
]}
student.create_index(['course'])