Mongo索引对OBJECT字段的处理规则及自定义_id索引相关问题咨询
问题1解答
MongoDB默认会为_id字段自动创建唯一索引,当你把_id设置为嵌套对象结构时,该索引是**对整个_id对象整体构建索引,而非对内部嵌套的各个字段单独构建独立索引,也不会出现索引失效的问题,只是该索引的生效前提是查询条件需要匹配整体_id对象的结构、字段顺序和内容。
问题2解答
要根据查询写法判断:
- 如果你查询时采用整体
_id对象匹配,即查询条件写为db.collection.find({_id: {userId: 123, accountId: 456}}),_id索引可以完全生效,能提供显著的查询加速效果。 - 如果你查询时分别指定嵌套字段筛选,即查询条件写为
db.collection.find({"_id.userId": 123, "_id.accountId": 456}),该_id整体索引无法为这类查询提供加速,需要额外为_id.userId和_id.accountId建立复合索引才能满足加速需求。
问题3解答
这个理解是错误的。MongoDB对_id的唯一性校验是**按对象的实际内容、字段顺序做值相等校验,而非引用相等校验。只要两个_id对象的字段内容完全一致、字段的排列顺序也完全一致,就会被判定为相同的_id,会触发唯一键冲突,插入操作会报错,哪怕两个_id是不同的内存对象也不影响判定结果。
如果两个_id嵌套字段内容相同但字段顺序不同,比如{accountId: 123, userId: 123}和{userId: 123, accountId: 123}会被判定为不同的_id,不会触发冲突。
内容的提问来源于stack exchange,提问作者Switch386
相关产品推荐
相关产品推荐

