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

$geoNear一致する最も近い配列

    まず、実世界の座標で地理空間クエリを実行する場合は、コレクションの「2dsphere」インデックスを作成することを強くお勧めします。

    遊んでいた可能性のある他のインデックスを必ず削除してください:

    db.records.dropIndexes();
    db.records.createIndex({ "addresses.loc": "2dsphere" })
    

    やりたいことをするために、最初に includeLocsも含むわずかな変更を見てください。 $geoNearへのオプション

    db.records.aggregate([
      { "$geoNear": {
         "near": [ -73.9815103, 40.7475731 ],
         "spherical": true,
         "distanceField": "distance",
         "includeLocs": "locs"
      }}
    ])
    

    これで、次のような出力が表示されます。

    {
            "_id" : ObjectId("592d0c78555a7436b0883960"),
            "userid" : 7,
            "addresses" : [
                    {
                            "apporx" : 50,
                            "loc" : [
                                    -73.98137109999999,
                                    40.7476039
                            ]
                    },
                    {
                            "apporx" : 15,
                            "loc" : [
                                    -73.982002,
                                    40.74767
                            ]
                    },
                    {
                            "apporx" : 10,
                            "loc" : [
                                    -73.9819567,
                                    40.7471609
                            ]
                    }
            ],
            "distance" : 0.0000019174641401278624,
            "locs" : [
                    -73.98137109999999,
                    40.7476039
            ]
    }
    

    したがって、返されたのは、最も近いポイントまでの距離だけでなく、使用された一致が「どの」場所であったかということでした。

    したがって、 $filter 元の配列で最も近い配列を返す場合は、次のことができます。

    db.records.aggregate([
      { "$geoNear": {
         "near": [ -73.9815103, 40.7475731 ],
         "spherical": true,
         "distanceField": "distance",
         "includeLocs": "locs"
      }},
      { "$addFields": {
        "addresses": {
          "$filter": {
            "input": "$addresses",
            "as": "address",
            "cond": { "$eq": [ "$$address.loc", "$locs" ] }
          }
        }
      }}
    ])
    

    そして、それはその一致のみを持つ配列を返します:

    {
            "_id" : ObjectId("592d0c78555a7436b0883960"),
            "userid" : 7,
            "addresses" : [
                    {
                            "apporx" : 50,
                            "loc" : [
                                    -73.98137109999999,
                                    40.7476039
                            ]
                    }
            ],
            "distance" : 0.0000019174641401278624,
            "locs" : [
                    -73.98137109999999,
                    40.7476039
            ]
    }
    



    1. MongoDBでドキュメントのサイズを取得する2つの方法

    2. MongoDBの2つの日付フィールドを比較します

    3. MongoDBの多くのGeoJSONポイント間のルート距離を計算するにはどうすればよいですか?

    4. Django-セロリとredisで非同期タスクキューを使用する方法