Недавно я создавал приложение, использующее сообщения на основе местоположения, и я хотел реализовать сообщения с помощью MongoDB. Используя оператор $ near, программист может действительно легко запросить в базе данных записи, которые попадают на расстояние, которое пролетит по прямой на сфере, без использования сложной математики, такой как формула Хаверсина:
Я реализовал это решение, используя Javascript, Mongoose, Express и Node. Я в восторге от применения крутых функций БД, таких как $ near. Но я пропущу основы настройки приложения Express и mongoose для этой демонстрации.
Во-первых, мы должны определить нашу схему. С мангустом это довольно просто. Представьте, что мы создаем приложение с сообщениями, которые хранятся по местоположению. Нам нужно запросить mongoDB с координатами широты и долготы и найти сообщения на определенном расстоянии от этих координат.
Схема:
var mongoose = require("mongoose"); var Schema = mongoose.Schema; var MessageSchema = new Schema( { username: String, text: String, location: { type: { type: String }, coordinates: [] }, { timestamps: true } ); MessageSchema.index({ location: "2dsphere" }); var Message = mongoose.model("Message", MessageSchema); module.exports = Message;
Наш объект местоположения имеет тип Object, поэтому, когда мы запрашиваем «type: Point», мы не вмешиваемся в «type: String». Координаты будут сохранены в виде массива в формате [долгота, широта]. Мы индексируем местоположение и сообщаем mongoDB, что мы используем «2dsphere».
Представьте, что на этот раз мы просто жестко кодируем mongoDB для развлечения:
var message = new Message({ username: "SexySkeletor", text: "Hello World", location: { type: "Point", coordinates: [36.098948, -112.110492] }, }); message.save((err, message) => { if (err) console.log(err); console.log(message); });
А теперь, чтобы найти наше сообщение, мы запрашиваем волшебный оператор $ near.
Message.find({ location: { $near: { $maxDistance: 1000, $geometry: { type: "Point", coordinates: [long, latt] } } } }).find((error, results) => { if (error) console.log(error); console.log(JSON.stringify(results, 0, 2)); });
В нашем запросе «$ maxDistance» - это расстояние в метрах от значений долготы и широты. Мы используем обратные вызовы error first в узле, а параметр результатов будет содержать массив всех сообщений и их местоположений:
[ { location: { coordinates: [36.098948, -112.110492], type: "Point" }, _id: "5acc105fd3e5d62bcbc24dbe", username: "SexySkeletor", text: "Hello World", createdAt: "2018-04-10T01:16:15.777Z", updatedAt: "2018-04-10T01:16:15.777Z", }, { location: { coordinates: [36.098948, -112.110492], type: "Point" }, _id: "5acc10b4d3e5d62bcbc24dbf", username: "DoodleBob", text: "Meahoy, memoyay? MeyoyYOY, ladyonmamoy!", createdAt: "2018-04-10T01:17:40.430Z", updatedAt: "2018-04-10T01:17:40.430Z", } ];
Спасибо за прочтение…