用有效的方式过滤大 collection
Filter large collection with an efficient way
我正在开发像优步这样的应用程序,我有 collection 名司机, currentPosition { latitude , longitutde }
而且我想让车手远离 200 米,我在模型上的做法是这样的:
driverSchema.methods.CloseDriver = function (userCurrentPosition,next) {
try {
const distance = geolib.getPreciseDistance(
userCurrentPosition,
this.currentPosition
);
return distance <= 200
} catch (error) {
return next();
}
}
然后使用 post 请求,其中包含用户的 currentPosition
const parsedBody = Object.setPrototypeOf(req.body, {});
if(parsedBody.hasOwnProperty("latitude") && parsedBody.hasOwnProperty("longitude")){
const { latitude , longitude } = req.body
const currentPosition = { latitude , longitude }
const drivers = await Driver.find({})
const eligibleDrivers = drivers.filter((driver)=> driver.CloseDriver(currentPosition))
return res.status(200).json({
status : 200 ,
eligibleDrivers
});
如果我们有大量的驱动程序,如果有另一种方法,效率会不高吗?
您可以使用 $geoNear
和 aggregate
来从您的查询本身实现这一点,而不是加载所有驱动程序,然后在 javascript
中执行此过滤器
查看此代码
db.drivers.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ CurrentLongitude, CurrentLatitude ] },
distanceField: "distance",
maxDistance: 2,
includeLocs: "currentPosition",
spherical: true
}
}
]);
您必须像这样在架构中存储驱动程序的 currentPosition latlang
"currentPosition": {
"type" : "Point",
"coordinates" : [ -73.9375, 40.8303 ]
},
我正在开发像优步这样的应用程序,我有 collection 名司机, currentPosition { latitude , longitutde }
而且我想让车手远离 200 米,我在模型上的做法是这样的:
driverSchema.methods.CloseDriver = function (userCurrentPosition,next) {
try {
const distance = geolib.getPreciseDistance(
userCurrentPosition,
this.currentPosition
);
return distance <= 200
} catch (error) {
return next();
}
}
然后使用 post 请求,其中包含用户的 currentPosition
const parsedBody = Object.setPrototypeOf(req.body, {});
if(parsedBody.hasOwnProperty("latitude") && parsedBody.hasOwnProperty("longitude")){
const { latitude , longitude } = req.body
const currentPosition = { latitude , longitude }
const drivers = await Driver.find({})
const eligibleDrivers = drivers.filter((driver)=> driver.CloseDriver(currentPosition))
return res.status(200).json({
status : 200 ,
eligibleDrivers
});
如果我们有大量的驱动程序,如果有另一种方法,效率会不高吗?
您可以使用 $geoNear
和 aggregate
来从您的查询本身实现这一点,而不是加载所有驱动程序,然后在 javascript
查看此代码
db.drivers.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ CurrentLongitude, CurrentLatitude ] },
distanceField: "distance",
maxDistance: 2,
includeLocs: "currentPosition",
spherical: true
}
}
]);
您必须像这样在架构中存储驱动程序的 currentPosition latlang
"currentPosition": {
"type" : "Point",
"coordinates" : [ -73.9375, 40.8303 ]
},