sql >> Base de Datos >  >> NoSQL >> MongoDB

$geoNear matriz más cercana coincidente

En primer lugar, le recomiendo encarecidamente que cree un índice "2dsphere" para su colección si tiene la intención de realizar consultas geoespaciales en coordenadas del mundo real.

Asegúrate de eliminar otros índices con los que hayas estado jugando:

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

Para hacer lo que quieras, primero echa un vistazo a la ligera modificación que también incluye el includeLocs opción para $geoNear

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

Ahora verá una salida similar a esta:

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

Entonces, lo que devolvió no fue solo la distancia al punto más cercano, sino también "qué" ubicación fue la coincidencia utilizada.

Entonces, si desea $filter la matriz original para devolver la más cercana, entonces puede:

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

Y eso devuelve la matriz con solo esa coincidencia:

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