MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Намерете местоположение в съхранен кръг

Още по-оптимално от оригинала, сега можете да използвате $expr в рамките на $match етап след първоначалния $geoNear :

db.collection.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},
    { "$match": { "$expr": { "$lte": [ "$distance", "$radius" ] } }}
])

Всъщност малко по-оптимално, отколкото когато беше написано за първи път. Сега можем просто да $redact вместо $project булевото и $match по-късно:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius and remove if not
    { "$redact": {
        "$cond": {
            "if": { "$lte": [ "$distance", "$radius" ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Вие сте съхранили информацията точно както трябва, но има различен подход за получаване на резултатите, отколкото си мислите.

Това, което искате да използвате, е $geoNear и по-специално рамката за агрегиране формата на този оператор. Ето какво правите:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius
    { "$project": {
        "location": 1,
        "radius": 1,
        "distance": 1,
        "within": { "$lte": [ "$distance", "$radius" ] }
    }},

    // Match only documents within the radius
    { "$match": { "within": true } }
])

Така че този формуляр позволява разстоянието от заявената точка да бъде „проектирано“ в резултатите, като същевременно заявката ще върне само най-близките документи.

След това използвате логическо сравнение, за да видите дали стойността на „разстояние“ е по-малка от „радиус“, следователно в рамките на кръга.

Накрая съпоставяте, за да филтрирате само онези резултати, при които твърдението „вътре“ е вярно.

Можете да добавите други опции към $geoNear както е показано в документацията. Също така силно препоръчвам вашето хранилище да използва и формата GeoJSON, тъй като той вероятно ще бъде по-съвместим с всички други библиотеки, които можете да използвате, за да работите върху получените резултати.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Инсталиране и стартиране на MongoDB на OSX

  2. не може да се свърже с mongodb, хостван на отдалечен сървър, използвайки monk

  3. ArgumentException:Невалидна ключова дума 'mongodb+srv://test:[email protected]' в MongoDB + Unity2D - Live MongoDB не се свързва

  4. tar gzip mongo dump като MySQL

  5. В pymongo на MongoDB, как да направя count()?