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

Как да получа всички кръгове, в които се съдържа точка?

Възможно е с помощта на $geoIntersects на MongoDB Оператор за геопространствени заявки.

Така че, ако имате колекция от многоъгълници на GeoJson и искате да откриете всички многоъгълници, които се пресичат с дадена точка, тогава трябва да изпълните следното:

db.places.find( { <locationFieldOfYourDocuments> :
                  { $geoIntersects :
                    { $geometry :
                      { type : "Point" ,
                        coordinates: [long, lat]
                } } } } )

В командата по-горе, loc е този атрибут на всеки документ, който съдържа координатите за полигона GeoJson. Също така се уверете, че имате 2dsphere индекс върху <locationFieldOfYourDocuments> .

Сега, за да разреша първоначалния ви проблем, ще използвам малко javascript. Може да има по-добри решения, но не и доколкото ми е известно.

Да приемем, че всичките ви кръгове се съхраняват в Circles колекция. Бих направил запитване към тази колекция и бих извлякъл всеки кръг един по един и след това изпълних пресичане с друга колекция, която би съдържала една точка, която ще бъде тази, която искате да направите запитване, дали се пресича с кръговете или не. Така че нека точката се съхранява в SinglePoint колекция.

Сценарият би изглеждал така...

db.Intersections.remove({}); // emptying the output collection
var circleCursor = db.Circles.find();
while (circleCursor.hasNext()) {
    var circle = circleCursor.next();
    var coord = circle.location;
    var radiusInRadians = circle.radius * conversionFactorForRadius;
    var intersect = db.SinglePoint.find({loc :
                                         { $geoWithin :
                                           {$centerSphere : [coord], radiusInRadians}
                                         }});
    if (intersect.hasNext()) {db.Intersections.add(circle)} // this will add all intersecting circles to Intersections collection
}

Всичко, което трябва да направите, е да запишете този скрипт във файл (myScript.js) и да направите повикване:

mongo DBName pathTomyScript.js

Това ще съхрани всички кръгове, които се пресичат с вашата входна точка в колекцията Intersects. Всички горепосочени колекции трябва да бъдат в базата данни DBName.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Има ли начин да създадете или актуализирате MongoDB индекс?

  2. Как да създам първия потребител на mongodb с разрешено оторизиране?

  3. Какъв е най-добрият начин да направите ajax пагинация с MongoDb и Nodejs?

  4. Списък с индекси в MongoDB?

  5. Агрегатът Mongoose връща празен резултат