我正在使用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))
所以我不确定在这种情况下如何使用索引?,任何人都可以提供有关它的更多信息。 另外,如果我的索引方案或集合架构有问题,请提出建议。 谢谢。
答案 0 :(得分:0)
实际上,您具有不需要的索引。 您可以将索引减少为:
'indexes': [('school_id', 'first_name', 'user_status'),('school_id',
'creation_time','user_status')]
这不是因为查询的字段顺序而是必需的,仅因为该字段存在于查询中。因此,即使索引具有三个字段,查询也只能使用这些第一个字段中的两个。规则是索引的第一个字段必须位于查询中,以便查询可以使用该索引。