Как применить фильтр where на включенных моделях в loopback 3.X - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь выполнить геопространственный запрос для вложенной модели в 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": []
      }
    ]
  }

Как вы можете видеть, у второго курса есть только одна локация, которая находится за пределами диапазона, который я прошел, но он возвращается.

Какой-нибудь совет по поводу чего-то неправильного в моем коде?

...