MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zdobyć wszystkie okręgi, w których znajduje się Punkt?

Jest to możliwe przy użyciu $geoIntersects MongoDB Geoprzestrzenny operator zapytań.

Tak więc, jeśli masz kolekcję wielokątów GeoJson i chcesz znaleźć wszystkie wielokąty, które przecinają się z danym punktem, musisz uruchomić następujące polecenie:

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

W powyższym poleceniu loc jest tym atrybutem każdego dokumentu, który zawiera współrzędne wielokąta GeoJson. Upewnij się również, że masz 2dsphere indeksuj nad <locationFieldOfYourDocuments> .

Teraz, aby rozwiązać twój pierwotny problem, użyję trochę javascriptu. Mogą istnieć lepsze rozwiązania, ale nie według mojej wiedzy.

Załóżmy, że wszystkie Twoje kręgi są przechowywane w Circles kolekcja. Zapytałbym o tę kolekcję i pobierał każdy krąg jeden po drugim, a następnie wykonałbym przecięcie z inną kolekcją, która zawierałaby pojedynczy punkt, który byłby tym, o który chcesz zapytać, czy przecina się z kręgami, czy nie. Więc niech punkt będzie przechowywany w SinglePoint kolekcja.

Skrypt wyglądałby tak...

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
}

Wszystko, co musisz zrobić, to zapisać ten skrypt w pliku (myScript.js) i wykonać połączenie:

mongo DBName pathTomyScript.js

Spowoduje to zapisanie wszystkich okręgów przecinających się z punktem wejściowym w kolekcji Przecięcia. Wszystkie powyższe kolekcje powinny znajdować się w bazie danych DBName.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. użyj mongoose model.find(), aby uzyskać wszystkie wpisy tylko jednego pola

  2. Agregacja MongoDB wydaje się bardzo powolna

  3. Zaimplementuj autouzupełnianie w MongoDB

  4. Uwierzytelnianie aplikacji NodeJS i MongoDB przez JWT

  5. Połączenie z MongoDB nie powiodło się podczas korzystania z platformy .NET Core działającej w systemie Linux