Я использую запрос MongodbDB Geospatial
для извлечения данных в пределах определенных миль и использую $geoWithin
и $centerSphere
для тех же. Это выборка данных в случайных милях, т. Е. Означает, что они не выбираются в порядке возрастания, но я хочу получить данные в виде в порядке возрастания в соответствии с милями .
Например: Если я хочу получить данные в пределах 100 миль и 3 документа существуют в БД 16 миль, 38 миль и 92 миль.
затем первый документ, который он должен получить, составляет 16 миль, второй - 38 миль, а последний - 92 мили.
Я использую запрос ниже для извлечения данных:
if (req.query.radius) {
var coordinates = '75.34121789,30.1471305';
let queryBuilder["shop.shopInfo.address"] = {
$geoWithin : {
$centerSphere: [coordinates,(parseInt(req.query.radius)/3959)]
}
};
}
Products.aggregate([
{
$lookup : {
from:"shops",
localField:'shop',
foreignField:'_id',
as:"shop"
}
},
{
$match: queryBuilder
}
]).then((products)=>{
res.json(products);
})
Ниже представлены магазин и коллекция товаров для справки:
Магазин
{
"_id" : ObjectId("5cef976852e7ca2f48feec68"),
"shopInfo" : {
"name" : "Rajat Baker's and Sweets",
"address" : {
"type" : "Point",
"_id" : ObjectId("5cef976852e7ca2f48feec69"),
"coordinates" : [
35.9349341,
31.9561535
]
},
"maximum_delivery_radius" : 25
}
}
Продукт
{
"_id" : ObjectId("5ce7a01757e96237ec5e49dc"),
"name" : "Sandwich",
"description" : "Tasty Sandwich",
"price" : 30,
"max_delivery_radius" : 92,
"shop" : ObjectId("5cef976852e7ca2f48feec68")
},
{
"_id" : ObjectId("5ce7a01757e96237ec5e49da"),
"name" : "Banana Shake",
"description" : "Tasty banana shake with dry fruits",
"price" : 40,
"max_delivery_radius" : 16,
"shop" : ObjectId("5cef976852e7ca2f48feec62")
},
{
"_id" : ObjectId("5ce7a01757e96237ec5e49dt"),
"name" : "pizza",
"description" : "Tasty pizza",
"price" : 15,
"max_delivery_radius" : 38,
"shop" : ObjectId("5cef976852e7ca2f48feec68")
}