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() で確認すると、2d インデックスが存在します。mongodb が index を認識しないのはなぜですか? 私が間違っていることはありますか?

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 に答える