复合索引如何在mongodb中工作?

时间:2018-07-25 08:01:27

标签: python mongodb mongoengine database-indexes mongodb-indexes

我正在使用pymongo和mongoengine,下面是收集模式。

class Person(Document, BaseMixin):
    school_id = StringField(required = True)
    first_name = StringField(default="")
    last_name = StringField(default="")
    email = StringField(default="")
    creation_time = DateTimeField(default = datetime.utcnow())
    user_status = StringField(default='active') # possible values, 'active', 'blocked', 'deleted'
    meta = {
        'indexes': [('school_id', 'first_name'), ('school_id', 'user_status', 'first_name'),
                    ('school_id', 'user_status', 'creation_time'), ('school_id', 'creation_time')],
        'index_background': True
    }

我想获取特定日期范围内活动和阻止的用户列表,并按其名字搜索活动和阻止的用户。 我正在浏览有关索引的mongo文档,发现该文档说明在状态mongo docs

上使用索引更好

我创建了以上索引,以测试在处理查询时mongo选择了哪些索引。集合包含多个学校的数据,因此在school_id上添加了索引。 第一个查询:使用的索引= school_id_1_user_status_1_first_name_1

Person.objects(school_id = 'test', user_status__in = ['active', 'blocked'], first_name = 'test_name')

第二个查询:使用的索引= school_id_1_creation_time_1

Person.objects(school_id = 'test', user_status__in = ['active', 'blocked'], creation_time__gte = datetime(2018, 7, 1))

所以我不确定在这种情况下如何使用索引?,任何人都可以提供有关它的更多信息。 另外,如果我的索引方案或集合架构有问题,请提出建议。 谢谢。

1 个答案:

答案 0 :(得分:0)

实际上,您具有不需要的索引。 您可以将索引减少为:

 'indexes': [('school_id', 'first_name', 'user_status'),('school_id',
 'creation_time','user_status')]

这不是因为查询的字段顺序而是必需的,仅因为该字段存在于查询中。因此,即使索引具有三个字段,查询也只能使用这些第一个字段中的两个。规则是索引的第一个字段必须位于查询中,以便查询可以使用该索引。