MongoDB研究:复合索引中主键排序问题

C 2022-3-1 992

更新:亲测,MongoDB Compass GUI 界面中无法加入的索引,可以在 MongoSH 里面加入!

正好公司和我自己的项目都要用,今天主动加班了一个多小时到现在。

MongoDB在进行复合查询,涉及主键时,例如c=3,_id<ObjectId('621df61246f6073fc0cfa596')

{'c':3,'_id':{$lt:ObjectId('621df61246f6073fc0cfa596')}}

如果有多个“c=3”的Document时,即便已经对“c”字段进行了索引,如果查询条件为:

{'c':-1},那么也会返回错误的结果(“c=3”且“_id”为最小值),因为主键“_id”默认ASC排序。

但如果查询遵照{'c':-1,_id:-1}索引方式时,解释器显示会先对所有“a=3”的结果进行排序,然后再Fetch。

这是无法接受的,因为会造成 Sorted in Memory 资源占用。

由此得出“_id”主键在复合索引中无法被加入,如果真的需要可以复制一下然后做索引。

不过与其加一个重复字段,不如给其他字段建立一个不可重复ID,例如修改时间做ObjectId指纹。

最新回复 (0)
返回
发新帖