如果复合索引更大,那么单个字段是否会更好地将所有值的串联散列添加到所有对象,将单个索引添加到散列字段并通过该索引进行搜索(尽管听起来不像好的做法)?
这些完成不同的事情。复合索引具有顺序并且该顺序具有效果。例如,该索引{ 'country' : 1, 'city' : 1, 'postcode' : 1 }
将允许搜索特定国家的特定城市中的所有地址。散列不能做到这一点——散列只支持完全匹配。
我根本看不出这是一种不好的做法,这只是一个非常狭窄的用例。请记住,拼写、额外空格等的每一个细微差别都会导致不同的哈希值,而且您甚至无法回答诸如“我们在 X 国家/地区存储多少地址?”之类的简单问题。但如果你不需要那个,为什么不呢?
顺便说一句,MongoDB 对此有内置支持。如果地址是嵌入的,则在整个子文档上使用散列索引将完成您需要的操作:
MongoDB 支持任何单个字段的哈希索引。散列函数折叠嵌入的文档并计算整个值的散列,
例如:
> db.hash.insert( {"name": "john", "address" : { "city" : "Chicago", "state":"IL",
"country" : "US" } } );
WriteResult({ "nInserted" : 1 })
> db.hash.createIndex( { "address" : "hashed" } );
...
>
> This query uses the index and finds the document:
> db.hash.find({"address" : {"city" : "Chicago", "state": "IL", "country" : "US" } } );
>
> // this query wont find the document b/c of missing state, but is still fast (IXSCAN)
> db.hash.find({"address" : {"city" : "Chicago", "country" : "US" } } );