2

我想在给定位置附近获得凯文酒吧点。这是 userSpots 集合:

{   user:'Kevin',
    spots:[
        {   name:'a',
            type:'pub',
            location:[x,y]
        },
        {   name:'b',
            type:'gym',
            location:[v,w]
        }
    ]
},
{   user:'Layla',
    spots:[
        ...
    ]
}

这是我尝试过的:

db.userSpots.findOne(
    {   user: 'Kevin',
        spots: { 
            $elemMatch: {
                location:{ $nearSphere: [lng,lat], $maxDistance: d},
                type: 'pub'
                }
            }
        },
    },
    function(err){...}
)

我收到一个奇怪的错误。Mongo 告诉我位置字段中没有索引 :2d 。但是当我检查 db.userSpots.getIndexes() 时,二维索引就在那里。为什么 mongodb 看不到索引?有什么我做错了吗?

MongoError: can't find special index: 2d for : { spots: { $elemMatch: { type:'pub',location:{ $nearSphere: [lng,lat], $maxDistance: d}}}, user:'Kevin'}

db.userSpots.getIndexes() 输出:

    {
    "0" : {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "mydb.userSpots",
        "name" : "_id_"
    },
    "1" : {
        "v" : 1,
        "key" : {
            "spots.location" : "2d"
        },
        "ns" : "mydb.usersBoxes",
        "name" : "spots.location_2d",
        "background" : true,
        "safe" : null
    }
}
4

2 回答 2

2

对于类似的地理空间应用程序,我将位置转换为 GeoJSON:

{
    "_id" : ObjectId("5252cbdd9520b8b18ee4b1c3"),
    "name" : "Seattle - Downtown",  
    "location" : {
        "type" : "Point",
        "coordinates" : [
           -122.33145,
            47.60789
         ]
   }
}

(坐标采用经度/纬度格式。这里描述了 Mongo 对 GeoJSON 的使用。)。

索引是使用以下方法创建的:

db.userSpots.ensureIndex({"location": "2dsphere"})

在我的聚合管道中,我使用以下方法找到匹配项:

{"$match":{"location":{"$geoWithin": {"$centerSphere":[[location.coordinates[0], location.coordinates[1]], radius/3959]}}}}

(其中半径以英里为单位测量 - 幻数用于转换为弧度)。

于 2013-10-29T20:17:51.617 回答
0

为了索引包含地理数据数组的文档,MongoDB 使用多键索引。多键索引在索引之前将文档展开为具有单个值而不是数组的某些文档。因此索引将该键字段视为单值字段而不是数组。

尝试在没有 $elemMatch 运算符的情况下查询它。

于 2013-10-29T04:01:50.120 回答