sql >> Database >  >> NoSQL >> MongoDB

$geoNear overeenkomend met dichtstbijzijnde array

Ten eerste raad ik u ten zeerste aan om een ​​"2dsphere"-index voor uw verzameling te maken als u van plan bent georuimtelijke zoekopdrachten uit te voeren op coördinaten in de echte wereld.

Zorg ervoor dat u andere indexen verwijdert waarmee u mogelijk hebt gespeeld:

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

Om te doen wat je wilt, moet je eerst kijken naar de kleine wijziging die ook de includeLocs bevat optie om $geoNear

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

Nu ziet u een uitvoer die er als volgt uitziet:

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

Dus wat dat opleverde, was niet alleen de afstand tot het dichtstbijzijnde punt, maar ook 'welke' locatie de gebruikte wedstrijd was.

Dus als je wilt $filter de originele array om de dichtstbijzijnde te retourneren, dan kunt u:

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

En dat geeft de array terug met alleen die overeenkomst:

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



  1. Hoe kan ik datetiime van mongodb ophalen? Door de gegevens te vergelijken met jDateChosser Java

  2. geneste zoekopdrachten in pymongo met behulp van collection.find()

  3. mongodb javascript-update

  4. Hoe multitenancy voor redis in spring boot te implementeren?