我有一个MongoDB集合,其中包含一个位置(GeoJSON Point)和其他要过滤的字段。
{
"Location" : {
"type" : "Point",
"coordinates" : [
-118.42359,
33.974563
]
},
"Filters" : [
{
"k" : 1,
"v" : 5
},
{
"k" : 2,
"v" : 8
}
]
}
我的查询使用聚合函数,因为它执行一系列的过滤,排序,分组等操作。...进行过滤的第一步是我在执行地理附近操作时遇到麻烦。
$geoNear: {
spherical: true,
near: [-118.236391, 33.782092],
distanceField: 'Distance',
query: {
// Filter by other fields.
Filters: {
$all: [
{ $elemMatch: { k: 1 /* Bedrooms */, v: 5 } }
]
}
},
maxDistance: 8046
},
对于索引,我尝试了两种方法:
方法1:创建两个单独的索引,一个带有“位置”字段,另一个带有我们随后进行过滤的字段。这种方法很慢,在我的收藏集中数据很少的情况下,在5英里半径范围内查询需要3秒钟以上的时间。
db.ResidentialListing.ensureIndex( { Location: '2dsphere' }, { name: 'ResidentialListingGeoIndex' } );
db.ResidentialListing.ensureIndex( { "Filters.k": 1, "Filters.v": 1 }, { name: 'ResidentialListingGeoQueryIndex' } );
方法2:使用“位置”和我们过滤的其他字段创建一个索引。创建索引从未完成,因为它会产生大量有关“插入地理对象会生成大量键”的警告。
db.ResidentialListing.ensureIndex( { Location: '2dsphere', "Filters.k": 1, "Filters.v": 1 }, { name: 'ResidentialListingGeoIndex' } );
如果我仅执行$ geoNear操作并且不尝试查询,则geo索引本身似乎可以正常工作,然后在60ms内执行。但是,当我尝试在其他字段上查询之后,它就会变慢。任何有关如何正确设置查询和索引以使它运行良好的想法都将受到赞赏...