Я пытаюсь выполнить геопространственный запрос для вложенной модели в loopback 3.X.
В основном у меня есть 3 модели со следующими отношениями:
Категория
"relations": {
"deals": {
"type": "hasAndBelongsToMany",
"model": "Deal",
"foreignKey": ""
}
},
Сделка
"relations": {
"categories": {
"type": "hasAndBelongsToMany",
"model": "Category",
"foreignKey": ""
},
"locations": {
"type": "hasAndBelongsToMany",
"model": "Location",
"foreignKey": ""
}
}
Локации
"relations": {
"deals": {
"type": "hasAndBelongsToMany",
"model": "Deal",
"foreignKey": ""
}
}
Я пытаюсь получить список категорий, в которых присутствуют местоположения с определенными характеристиками, такими как геопространственные запросы.
Я не могу заставить фильтр where работать во вложенном объекте.
Я пробовал что-то вроде этого:
Category.near = (center, callback) => {
Category.find({
include: {
relation: 'deals',
scope: {
include: {
relation: 'locations',
where: {
'coordinates': {
geoWithin: {
$centerSphere: [[center.lat, center.lng], Utils.kmToRadians(500)],
},
},
},
},
},
},
}, (err, results) => {
if (err) {
const error = new Error(err.toString());
error.status = 500;
return callback(error);
}
return callback(null, results);
});
}
Запрос возвращает некоторые результаты, но он не фильтруется предложением where, которое я применил к отношению местоположений, он в основном возвращает все местоположения.
Мне нужен способ вернуть только те сделки, которые имеют хотя бы одно местоположение или хотя бы вернуть пустой массив в местоположениях в ответе.
Вот что получается из этого запроса сэти параметры:
http://localhost:3000/api/categories/near?center=45.2%2C9.2
И результат:
{
"name": "Tecnologia",
"image": "https://cdn4.iconfinder.com/data/icons/future-technology-2/91/Future_Technology_10-512.png",
"id": "5d9c5af49df2bb899f83ef0c",
"deals": [
{
"id": "5d8cb5f53900d859ac6280da",
"title": "Offerta Gianluca",
"description": "Meno 30% su Gianluca",
"img": [
"https://www.mcs4you.it/wp-content/uploads/OffertaSpeciale.png"
],
"amount": 100,
"percentage": 30,
"dateStart": "2019-10-16T12:58:29.048Z",
"dateFinish": "2019-10-18T12:58:29.048Z",
"merchantId": "5d8caf157b205d537b33a1e5",
"created_at": "2019-09-26T12:58:29.048Z",
"locations": [
{
"id": "5d9c559b7d24ed7b5e54315e",
"address": "Via Piacenza 20",
"name": "VIA PIACENZA",
"coordinates": {
"lat": 45.4491223,
"lng": 9.2028192
},
"merchantId": "5d8caf157b205d537b33a1e5",
"created_at": "2019-10-08T09:23:39.244Z"
}
],
"categories": [
{
"name": "Tecnologia",
"image": "https://cdn4.iconfinder.com/data/icons/future-technology-2/91/Future_Technology_10-512.png",
"id": "5d9c5af49df2bb899f83ef0c"
}
],
"companiesIncluded": [
{
"id": "5da6de1890d4d141c406bf26",
"name": "Loud",
"magentoId": 12,
"created_at": "2019-10-16T09:08:40.499Z"
}
],
"companiesExcluded": [
{
"id": "5da6de1f90d4d141c406bf27",
"name": "Bike-room",
"magentoId": 122,
"created_at": "2019-10-16T09:08:47.112Z"
}
]
},
{
"id": "5da9942b15f43d4e014f5b7a",
"title": "Deal test lontano",
"description": "Deal test lontano",
"img": [
"https://www.mcs4you.it/wp-content/uploads/OffertaSpeciale.png"
],
"percentage": 30,
"currency": "eur",
"dateStart": "2019-10-18T10:14:41.697Z",
"dateFinish": "2020-10-18T10:14:41.697Z",
"merchantId": "5d8caf157b205d537b33a1e5",
"created_at": "2019-10-18T10:30:03.843Z",
"locations": [
{
"id": "5da9946e15f43d4e014f5b7c",
"address": "Washington DC",
"name": "WASHINGTON DC",
"coordinates": {
"lat": 38.8935128,
"lng": -77.15466
},
"created_at": "2019-10-18T10:31:10.872Z"
}
],
"categories": [
{
"name": "Tecnologia",
"image": "https://cdn4.iconfinder.com/data/icons/future-technology-2/91/Future_Technology_10-512.png",
"id": "5d9c5af49df2bb899f83ef0c"
}
],
"companiesIncluded": [],
"companiesExcluded": []
}
]
}
Как вы можете видеть, у второго курса есть только одна локация, которая находится за пределами диапазона, который я прошел, но он возвращается.
Какой-нибудь совет по поводу чего-то неправильного в моем коде?