MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$geoNear correspondant au tableau le plus proche

Tout d'abord, je vous conseille fortement de créer un index "2dsphere" pour votre collection si vous avez l'intention de faire des requêtes géospatiales sur des coordonnées du monde réel.

Assurez-vous de supprimer les autres index avec lesquels vous avez peut-être joué :

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

Afin de faire ce que vous voulez, jetez d'abord un coup d'œil à la légère modification qui inclut également les includeLocs option pour $geoNear

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

Vous verrez maintenant une sortie qui ressemble à ceci :

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

Ainsi, ce qui a été renvoyé n'était pas seulement la distance jusqu'au point le plus proche, mais "quel" emplacement était la correspondance utilisée.

Donc, si vous vouliez $filter le tableau d'origine pour renvoyer le plus proche, alors vous pouvez :

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" ] }
      }
    }
  }}
])

Et cela renvoie le tableau avec uniquement cette correspondance :

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