如何根据函数猫鼬的结果查找文档

How to find documents based on the result of a function mongoose

所以我有两个模式 userdriver 它们都有纬度和经度属性。

有时我想查询附近司机的数据库,我会发送用户的当前位置(纬度和经度),我有一个计算两点之间距离的函数。

我正在尝试做这样的事情:

使用我的函数(该函数称为 calculateDistance)找到所有距离小于 2 KM 的司机。

在代码中这将是这样的:

const drivers = await Driver.find();

const driversToReturn = drivers.filter(
    driver => calculateDistance(userLat, userLong, driver.latitude, driver.longitude) <= 2
);

res.status(200).json({
  drivers: driversToReturn
});

但我认为这不是最好的方法,我已经检查了 mongoose virtuals 但我们不能将参数 (userLat and userLong) 传递给 virtual 的 get 方法而且我认为实例方法不是解决方案。

那我该怎么做呢?

谢谢

编辑

Driver型号

const mongoose = require("mongoose");
const { Schema } = mongoose;

const driverSchema = new Schema(
  {
    /** Required Attributes */
    name: { type: String, required: true },
    carBrand: { type: String, required: true },
    plateNumber: { type: String, required: true },
    password: { type: String, required: true },
    phoneNumber: { type: Number, required: true },
    price: { type: Number, required: true },
    latitude: { type: Number, required: true },
    longitude: { type: Number, required: true },

    /** Not Required Attributes */
    rating: { type: Number, required: false },
  },
  {
    timestamps: true,
  }
);

const Driver = mongoose.model("Driver", driverSchema);

module.exports = Driver;

用户模型

const mongoose = require("mongoose");
const { Schema } = mongoose;

const userSchema = new Schema(
  {
    /** Required Attributes */
    name: { type: String, required: true },
    password: { type: String, required: true },
    phoneNumber: { type: Number, required: true },
    latitude: { type: Number, required: true },
    longitude: { type: Number, required: true },
  },
  { timestamps: true }
);

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

module.exports = User;

用户控制器

const Driver = require("../models/driver");
const Order = require("../models/order");
const calculateDistance = require("../utils/calculateDistance");

const CIRCLE_RADIUS_IN_KM = 2;

exports.getNearbyDrivers = async (req, res, next) => {
  try {
    const userLat = req.body.userLat,
        userLong = req.body.userLong,
        drivers = await Driver.find();

    const driversToReturn = drivers.filter(
        (driver) =>
            calculateDistance(
                userLat,
                userLong,
                driver.latitude,
                driver.longitude
            ) <= CIRCLE_RADIUS_IN_KM
    );

    res.status(200).json({
      drivers: driversToReturn,
    });
  } catch (err) {
    if (!err.statusCode) {
      err.statusCode = 500;
    }

    next(err);
  }
};

这是 Mongoose 文档中的一些代码,我认为可以帮助您:

    const denver = { type: 'Point', coordinates: [-104.9903, 39.7392] };
    return City.create({ name: 'Denver', location: denver }).
      then(() => City.findOne().where('location').within(colorado)).
      then(doc => assert.equal(doc.name, 'Denver'));

这里是link:https://mongoosejs.com/docs/geojson.html