Недавно я создавал приложение, использующее сообщения на основе местоположения, и я хотел реализовать сообщения с помощью 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",
 }
];

Спасибо за прочтение…