1

我有几个类似于以下示例的地理查询。它们不仅是 Poly 查询中的一个点,而且还有其他方面。

询问:

{
"point": {
    "$within": {
        "$polygon": [
            [
                41.878335,
                -87.627319999999997
            ],
            [
                41.877602000000003,
                -87.627319999999997
            ],
            [
                41.879672999999997,
                -87.627031000000002
            ],
            [
                41.878723999999998,
                -87.627204000000006
            ],
            [
                41.878507999999997,
                -87.627262000000002
            ],
            [
                41.878335,
                -87.627262000000002
            ]
        ]
    }
},
"MYLISTING": {
    "$in": [
        "All"
    ]
},
"SUPPORT": {
    "$in": [
        "Y"
    ]
},
"TYPE": {
    "$in": [
        "Food"
    ]
}
}

为了帮助使这些更快,我将其他每个项目添加到索引中:

{   "v" : 1,
    "key" : {
        "point" : "2d",
        "MYLISTING" : 1,
        "SUPPORT" : 1,
        "TYPE" : 1
    },
    "ns" : "mydb.collection",
    "name" : "point_2d_MYLISTING_1_SUPPORT_1_TYPE_1"
}

然而,在对此进行解释时,它似乎从未使用过这个索引,它只是使用我拥有的另一个索引,它只是最初创建的 point:2d 索引。

我在这里有一些误解吗?

4

1 回答 1

1

您只能有一个地理索引 - 现在您有两个,其中一个部分是复合索引的一部分。文档中提到了限制:http: //api.mongodb.org/wiki/current/Geospatial%20Indexing.html#GeospatialIndexing-CreatingtheIndex

解决方案是简单地删除您在空间字段上的索引:

db.yourCollection.dropIndex( { point: '2d' };

然后,当您使用 explain() 运行查询时,您会看到现在再次使用了哪个索引 - 在这种情况下,应该是复合索引。还要确保地理空间字段是复合索引的第一部分,如下所述:http: //api.mongodb.org/wiki/current/Geospatial%20Indexing.html#GeospatialIndexing-CompoundIndexes

于 2012-11-22T09:22:07.060 回答