null
假设我必须通过如下地址集合搜索整个地址(我们可以假设我将始终拥有集合和查询中的所有可用字段)
{
name: String,
street: String,
postcode: String,
City: String,
Country: String
}
我的问题是:复合指数会有多大?如果复合索引比单个字段更大,那么向所有对象添加一个所有值的拼接的散列不是更好吗?向散列字段添加一个索引,然后用它进行搜索(尽管这听起来不是一个好方法)?
如果复合索引比单个字段更大,那么向所有对象添加一个所有值的拼接的散列不是更好吗?向散列字段添加一个索引,然后用它进行搜索(尽管这听起来不是一个好方法)?
这些完成不同的事情。复合索引有一个顺序,该顺序有影响。例如,索引将允许搜索特定国家的特定城市中的所有地址。散列不能做到这一点--散列只支持精确匹配。
我完全不认为这是一个糟糕的实践,这只是一个非常狭窄的用例。请记住,拼写上的每一个细微差别,额外的空白等都将导致不同的散列值,而且您甚至无法回答诸如“我们存储了多少个地址在国家X?”这样的简单问题。但如果你不需要,为什么不呢?
null
null
null
> 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" } } );