3

に一致する私は以下のようなレコードコレクションのMongoDB(3.4)で文書を持っている: -

{ 
     "_id" : ObjectId("592d0c78555a7436b0883960"), 
     "userid" : 7, 
     "addresses" : [ 
     { 
      "apporx" : 50.0, 
      "loc" : [ 
       -73.98137109999999, 
       40.7476039 
      ] 
     }, 
     { 
      "apporx" : 15.0, 
      "loc" : [ 
       -73.982002, 
       40.74767 
      ]   
     }, 
     { 
      "apporx" :10.0, 
      "loc" : [ 
       -73.9819567, 
       40.7471609 
      ] 
     } 
    ] 
    } 
` 

I created index on this collection using below query :- 
`db.records.createIndex({'addresses.loc':1})` 

when i execute my below query :- 
`db.records.aggregate( 
     {$geoNear : { 
     near : [ -73.9815103, 40.7475731 ], 
     distanceField: "distance" 
    }}); 

この結果は、あなたがこの複数の私の文書アドレスアレイで私を説明することができます私の距離field.nowを与えます要素が存在する。どのような要素がこの結果に当てはまるかはどうすれば判断できますか?

もう1つの質問: - 私が "addresses.apporx"の条件をより大きく、または同等にすると、この条件の場所を見つける方法はありますか?

答えて

2

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

あなたがで遊んでされている可能性があり、他のインデックスドロップするようにしてください:最初の$geoNearにもincludeLocsオプションが含まれて若干の修正を見てみましょう、あなたがやりたいために

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

{ 
     "_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 
     ] 
} 

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

今、あなたは、このような出力が表示されます

返されたものは、最も近いポイントまでの距離だけでなく、「どの」ロケーションが使用されたマッチであるかでした。

だから、あなたは、あなたができる、最寄り返すように$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 
     ] 
} 
+0

がyou..Myをありがとう最初の質問は解決されました。しかし、私のもう一つの質問: - 私は "アドレス.apporx"の条件をより大きいか等しいようにすれば、この状態の場所を見つける方法はありますか? – 5a01d01P

+0

@SandipKumarあなたは何を意味しているのか、それは異なる質問かもしれません。しかし、ドキュメントに投影されている "distanceFieldと比較する" *を意味する場合、上記のように、別のパイプラインステージを追加して2つの値を比較します。このために '$ project'と' $ redact'で遊んで、 '$ geoNear'マニュアルページから" distanceField "のドキュメントを読んでください。 –

+0

@SandipKumar "距離"のその点について。 GeoJSON形式は、従来の「配列」形式よりも優れているでしょう。その理由は、「距離」が「遺産」から返された距離が**ラジアン**であり、キロメートルと言う変換が必要なためです。 GeoJSONの座標を比較すると** meters **で結果が一貫して返されます。だから、おそらく "記憶された距離"とより一貫しているだろう。 –

関連する問題