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

Създайте и намерете GeoLocation в mongoose

Ако искате схема да поддържа GeoJSON, първо трябва да я конструирате правилно:

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

Това гарантира, че няма объркване с ключовата дума "type" на дефиницията на схемата. Ако наистина искате да поддържате цялата гама от типове GeoJSON, тогава можете да направите това малко по-свободно:

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

След това искате да свържете индекс към схемата:

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

След това, разбира се, дефинирайте модел и съхранявайте нещата правилно:

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

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

Отбелязвайки, че вашите данни трябва да са в географска дължина след това географска ширина ред, както се поддържа от GeoJSON и всички формуляри за геопространствени заявки на MongoDB.

След това, вместо да се задълбочавате в неясни употреби на команди на базата данни директно върху метода на необработения драйвер, вместо това използвайте неща, които се поддържат директно и по-добре. Като например $geoNear за .aggregate() метод:

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

    }
)

И сега, тъй като данните са GeoJSON, разстоянията вече са преобразувани в метри, така че няма нужда да се извършва друга работа по преобразуване.

Също така имайте предвид, че сте се забърквали с това, освен ако не пуснете колекцията, всеки индекс, който сте опитали, ще остане там и това вероятно ще причини проблеми.

Можете лесно да премахнете всички индекси от колекцията в обвивката на mongodb:

db.users.dropIndexes();

Или тъй като вероятно трябва да направите малко преоформяне на данни, след това изпуснете колекцията и започнете отново:

db.users.drop();

Настрой нещата както трябва и няма да имаш проблеми.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Spring Data mongo за вмъкване на нулеви стойности в DB

  2. Натиснете и задайте операции в същата актуализация на MongoDB

  3. Групово агрегиране с помощта на пролетни данни mongodb

  4. Mongodb:връща съответстващи филтри при използване на $or в find()

  5. MongoDB $cosh