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

Utwórz i znajdź geolokalizację w manguście

Jeśli chcesz, aby schemat obsługiwał GeoJSON, najpierw musisz go odpowiednio skonstruować:

var userSchema = new Schema({
    loc: {
        type: { type: String },
        coordinates: [Number],
    }
});

Dzięki temu nie ma pomyłek ze słowem kluczowym „type” definicji schematu. Jeśli naprawdę chcesz obsługiwać całą gamę typów GeoJSON, możesz to nieco rozluźnić:

var userSchema = new Schema({
    loc: {
        type: { type: String },
        coordinates: []
    }
});

Następnie chcesz powiązać indeks z shema:

userSchema.index({ "loc": "2dsphere" });

Następnie oczywiście zdefiniuj model i poprawnie przechowuj rzeczy:

var User = mongoose.model( "User", userSchema );

 var user = new User({ 
     "loc": { 
         "type": "Point",
         "coordinates": [-73.97, 40.77]
     }
 });

Pamiętaj, że Twoje dane muszą mieć długość geograficzną następnie szerokość geograficzna kolejność obsługiwana przez GeoJSON i wszystkie geoprzestrzenne formularze zapytań MongoDB.

Następnie, zamiast zagłębiać się w niejasne zastosowania poleceń bazy danych bezpośrednio w metodzie surowego sterownika, użyj zamiast tego rzeczy, które są bezpośrednio obsługiwane i lepsze. Na przykład $geoNear dla .aggregate() metoda:

User.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [<long>,<lat>]
            },
            "distanceField": "distance",
            "spherical": true,
            "maxDistance": 10000
        }}
    ],
    function(err,results) {

    }
)

A teraz, ponieważ dane są w formacie GeoJSON, odległości są już przeliczane na metry, więc nie ma potrzeby wykonywania innych prac związanych z konwersją.

Zwróć też uwagę, że bawiłeś się z tym, chyba że usuniesz kolekcję, każdy indeks, który wypróbowałeś, nadal tam będzie, co prawdopodobnie spowoduje problemy.

Możesz z łatwością usunąć wszystkie indeksy z kolekcji w powłoce mongodb:

db.users.dropIndexes();

Lub ponieważ prawdopodobnie będziesz musiał zmienić kształt danych, usuń kolekcję i zacznij od nowa:

db.users.drop();

Ustaw wszystko prawidłowo, a nie będziesz mieć problemów.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose dołącza do dwóch kolekcji i uzyskuje dane referencyjne w dwóch właściwościach

  2. Node.js Mongoose.js ciąg do funkcji ObjectId

  3. MongoDB na uwierzytelnianie mLab nie powiodło się

  4. Dlaczego gridfs get nie działa na identyfikatorze pliku (ObjectId) tylko według nazwy pliku

  5. Mongo i Node.js:znajdowanie dokumentu według _id przy użyciu identyfikatora UUID (GUID)