Skip to content

Commit

Permalink
feat: front mongo search with geoWithin
Browse files Browse the repository at this point in the history
  • Loading branch information
mtlmatt committed Jul 4, 2024
1 parent cb2ee0a commit 95d56c2
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ import {
LatestTaxiPositionModelExtended,
} from "./latestTaxiPosition.model";

// https://www.mongodb.com/docs/manual/core/indexes/index-types/geospatial/2d/calculate-distances/#convert-kilometers-to-radians
const meterToRadianRatio = 6378100;

class LatestTaxiPositionRepository {
public async findClosestTaxis(
coordinate: ICoordinates,
Expand All @@ -20,21 +23,36 @@ class LatestTaxiPositionRepository {
): Promise<LatestTaxiPositionModelExtended[]> {
const db = getMongoDb();

const filters = inquiryTypes.map((inquiryType) => ({
isPromoted: true,
status: TaxiStatus.Free,
...operatorsCondition(operators),
...transportationTypeCondition(inquiryType),
location: {
$near: {
$geometry: {
type: "Point",
coordinates: [coordinate.lon, coordinate.lat],
const point = [coordinate.lon, coordinate.lat];
const filters = inquiryTypes.map((inquiryType) => {
const radius = getArbitraryMaxDistance(inquiryType);
return {
isPromoted: true,
status: TaxiStatus.Free,
...operatorsCondition(operators),
...transportationTypeCondition(inquiryType),
$and: [
{
location: {
$geoWithin: {
$centerSphere: [point, radius / meterToRadianRatio],
},
},
},
$maxDistance: getArbitraryMaxDistance(inquiryType),
},
},
}));
{
location: {
$near: {
$geometry: {
type: "Point",
coordinates: point,
},
$maxDistance: radius,
},
},
},
],
};
});

const results = await Promise.all(
filters.map((filter) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export function generateApiTestCoordinates(): ICoordinates {
return { lat: generateLatForApiTest(), lon: generateLonForApiTest() };
}

export function generatePointsForLoadTest(count: number = 1): ICoordinates {
export function generatePointsForLoadTest(count: number = 1): ICoordinates[] {
const features = randomPointsOnPolygon(count, montrealPolygon);
const points = features.map((feature: any) => {
const point = feature.geometry.coordinates;
Expand Down

0 comments on commit 95d56c2

Please sign in to comment.