Mongodb$near query扫描了我的大部分收藏

Mongodb$near query扫描了我的大部分收藏,mongodb,indexing,geospatial,database-performance,Mongodb,Indexing,Geospatial,Database Performance,我收集了10万份文件 我执行以下查询: db.pois.find({ location: { $near: { $geometry: { type: "Point", coordinates: [ 8.969423677143416, 45.9998108142721 ] } } }, status: "enabled", category_ids: { $in: [ ObjectId('56056db896b23c29e2000001') ] } }).skip(0).limit(1000)

我收集了10万份文件

我执行以下查询:

db.pois.find({ location: { $near: { $geometry: { type: "Point", coordinates: [ 8.969423677143416, 45.9998108142721 ] } } }, status: "enabled", category_ids: { $in: [ ObjectId('56056db896b23c29e2000001') ] } }).skip(0).limit(1000)
因为我有这个复合索引:

 {
    "v" : 1,
    "key" : {
        "location" : "2dsphere",
        "status" : 1,
        "category_ids" : 1,
        "properties.property_id" : 1,
        "properties.value" : 1
    },
    "name" : "location_2dsphere_status_1_category_ids_1_properties.property_id_1_properties.value_1",
    "ns" : "poi_database_production.pois",
    "2dsphereIndexVersion" : 2
  }
我期待着更好的表现

使用explain'executionStats',我看到正在使用索引,但检查的键是~5K;这是扫描文件的数量吗

但是我只有1K POI与给定的category_id关联,那么为什么要检查5K密钥呢

explain的完整输出为

我希望mongo使用索引来限制基于状态和类别的文档,然后使用地理空间部分来获取1K最近的POI


为什么我要做这样的扫描?这是正常行为吗?

考虑到这一点,这相当正常。值得注意的是,您所谈论的是一个类别id,您似乎没有试图在查询中对其进行筛选。如果存在减少结果的因素,则将其添加到查询中。MangGDB也声明字段的索引顺序是合理的,但是我认为最好还是以最常用的顺序来实现复合索引字段,并且尽可能地过滤结果的顺序。这样做将减少扫描。还请注意,众所周知,地理空间查询错误地报道了扫描的数据items@BlakesSeven我复制粘贴了错误的查询;我更新了我的问题。您提到地理空间查询错误地报道了扫描的项目,这听起来不太好听。。。