sql >> データベース >  >> NoSQL >> MongoDB

マングースでジオロケーションを作成して検索

    スキーマでGeoJSONをサポートする場合は、最初にそれを適切に構築する必要があります。

    var userSchema = new Schema({
        loc: {
            type: { type: String },
            coordinates: [Number],
        }
    });
    

    これにより、スキーマ定義の「type」キーワードと混同されないようになります。本当にすべてのGeoJSONタイプをサポートしたい場合は、それを少し緩くすることができます:

    var userSchema = new Schema({
        loc: {
            type: { type: String },
            coordinates: []
        }
    });
    

    次に、インデックスをシェマに結び付けます:

    userSchema.index({ "loc": "2dsphere" });
    

    次に、もちろんモデルを定義し、物事を正しく保存します:

    var User = mongoose.model( "User", userSchema );
    
     var user = new User({ 
         "loc": { 
             "type": "Point",
             "coordinates": [-73.97, 40.77]
         }
     });
    

    データは経度である必要があることに注意してください 次に緯度 GeoJSONおよびすべてのMongoDB地理空間クエリフォームでサポートされている順序。

    次に、rawドライバーメソッドで直接データベースコマンドのあいまいな使用法を掘り下げるのではなく、直接サポートされているものを使用します。 $geoNearなど .aggregate()の場合 方法:

    User.aggregate(
        [
            { "$geoNear": {
                "near": {
                    "type": "Point",
                    "coordinates": [<long>,<lat>]
                },
                "distanceField": "distance",
                "spherical": true,
                "maxDistance": 10000
            }}
        ],
        function(err,results) {
    
        }
    )
    

    また、データはGeoJSONであるため、距離はすでにメートルに変換されているため、他の変換作業を行う必要はありません。

    また、コレクションを削除しない限り、試したインデックスは引き続き存在し、問題が発生する可能性がある場合を除いて、これをいじっていることにも注意してください。

    mongodbシェルのコレクションからすべてのインデックスを簡単に削除できます:

    db.users.dropIndexes();
    

    または、データの再形成が必要になる可能性があるため、コレクションを削除してやり直してください:

    db.users.drop();
    

    適切に設定すれば問題はありません。



    1. JSONを表すRedis文字列とRedisハッシュ:効率?

    2. 複数のドキュメントをアトミックに更新して返却する

    3. 既存のmongodbコレクションにデフォルトの照合を追加します

    4. ターンベースのマルチプレイヤーiPhoneボードゲーム用にDB&APIサーバーをどのように設計する必要がありますか? (nodejs、mongo、couchなどについて考えます)