如何使用MongoDB进行边界框查询?

如何使用MongoDB进行边界框查询?,mongodb,mongodb-query,mongodb-geospatial,Mongodb,Mongodb Query,Mongodb Geospatial,我似乎无法获得一个使用MongoDB的边界框查询,它实际上使用了空间索引 以下是我的索引: [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "config.Listings" }, { "v" : 2, "key" : { "LatLong"

我似乎无法获得一个使用MongoDB的边界框查询,它实际上使用了空间索引

以下是我的索引:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "LatLong" : "2dsphere"
        },
        "name" : "LatLong_2dsphere",
        "ns" : "config.Listings",
        "2dsphereIndexVersion" : 3
    },
    {
        "v" : 2,
        "key" : {
            "ListingId" : 1
        },
        "name" : "ListingId",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "Category" : 1,
            "Status" : 1
        },
        "name" : "Category_and_Status",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "Category" : 1,
            "Status" : 1,
            "Suburb" : 1
        },
        "name" : "Basic_Suburb_Search",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "LatLong.Coordinates" : "2d"
        },
        "name" : "LatLong.Coordinates_2d",
        "ns" : "config.Listings"
    }
]
起初我只是使用
2dsphere
索引,但后来我发现box查询只适用于
2d
索引

当我尝试使用
查询时,它似乎没有使用任何一个索引:

db.Listings.find( {
   LatLong: { $geoWithin: { $box:  [ [ 144.9941034, -37.8220633 ], [ 145.0551353, -37.79494 ] ] } }
} ).explain()
它确实返回结果,但执行
COLLSCAN
,速度非常慢

我也试过:

db.Listings.find( {
   "LatLong.coordinates": { $geoWithin: { $box:  [ [ 144.9941034, -37.8220633 ], [ 145.0551353, -37.79494 ] ] } }
} )
相同的结果-返回数据,但执行扫描

LatLong
是一个
GeoJSON
对象。下面是一个示例文档:

{
    "_id" : ObjectId("5bd64f2274cb40f172a328fb"),
    "LatLong" : {
        "type" : "Point",
        "coordinates" : [ 
            151.2504, 
            -33.96767
        ]
    },
    // other props removed for simplicity
}

有人能告诉我我做错了什么吗?

请用代码片段替换图像。最后一幅图像中的对象是开箱即用的边界。@AlexBlex有帮助吗?否则,我不确定您要的是什么代码段?索引、查询和文档。我可以试着在本地复制它,但我太懒了,无法输入所有内容。我几乎可以肯定这是一个案例,但我想在回答之前确认一下。@AlexBlex更新了,我发现了问题。你说得对,是索引上的外壳(是
坐标
,应该是
坐标
)。为什么MongoDB甚至允许这样做?就像它接受错误大小写的索引,但因为大小写而拒绝使用它们的查询一样?无论如何-问题解决了-如果您愿意,请给出一个答案,我将给您一些要点:)Mongodb是无模式的。只有在应用程序的上下文中,案例才是错误的。其他应用程序可以在同一文档中包含带有
坐标
坐标
甚至两者的文档。创建索引不需要具有特定字段的文档——它允许在空集合上定义索引,并在以后添加文档。它也不会拒绝查询-它扫描索引,在其中找到0个文档,并诚实地返回结果。基本上,这是灵活性的成本。当对特定应用程序有意义时,所有这些约束和检查都应该在应用程序级别实现。