sql >> Databáze >  >> NoSQL >> MongoDB

Vytvořte a najděte geolokaci v mongoose

Pokud chcete, aby schéma podporovalo GeoJSON, musíte jej nejprve správně zkonstruovat:

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

To zajišťuje, že nedojde k záměně s klíčovým slovem "type" definice schématu. Pokud opravdu chcete podporovat celou řadu typů GeoJSON, můžete to udělat trochu volnější:

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

Dále chcete k shema přiřadit index:

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

Pak samozřejmě definujte model a uložte věci správně:

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

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

Vaše data musí být v zeměpisné délce pak zeměpisná šířka objednat tak, jak to podporuje GeoJSON a všechny formuláře geoprostorových dotazů MongoDB.

Dále, místo abyste se hrabali v obskurních způsobech použití databázových příkazů přímo na metodě nezpracovaných ovladačů, použijte místo toho věci, které jsou přímo podporované a lepší. Například $geoNear pro .aggregate() metoda:

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

    }
)

A nyní, protože data jsou GeoJSON, vzdálenosti jsou již převedeny na metry, takže není třeba provádět další převodní práci.

Všimněte si také, že jste si s tím pohrávali, dokud kolekci nezrušíte, jakýkoli index, který jste zkusili, tam stále bude a to pravděpodobně způsobí problémy.

Všechny indexy z kolekce můžete snadno zrušit v prostředí mongodb:

db.users.dropIndexes();

Nebo protože pravděpodobně budete muset provést nějakou změnu tvaru dat, pak sbírku zahoďte a začněte znovu:

db.users.drop();

Nastavte věci správně a nebudete mít žádné problémy.



  1. Redis filtrovat podle rozsahu, seřadit a vrátit nejprve 10

  2. Jak získáte hodnotu řetězce MongoID pomocí PHP?

  3. Výjimka serializace Scala s hodnotou Enumeration

  4. Získání odlišné agregace pole pole napříč indexy