поиск с помощью pipe и geoIntersects, которые используют переменную let - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь найти окрестности, которые соответствуют моему состоянию - полигон boundries пересекается с координатами поста, но я не могу этого сделать - не могу использовать let в моем pipeline $match

пример почтового объекта:

{
  _id: ObjectId,
  ...,
  location: {
    ...,
    coordinates: {
      type: 'Point',
      coordinates: [number, number]
    }
  }
};

пример объекта соседства:

{
  _id: ObjectId,
  ...,
  boundries: {
    type: 'Polygon',
    coordinates: [ [ [number, number], [number, number], [number, number], [number, number], [number, number] ] ]
  }
};

пример запроса, который я пытаюсь исправить:

db.posts.aggregate([
  { $match: { _id: ObjectId('5a562e62100338001218dffa') } },
  {
    $lookup: {
      from: 'neighborhoods',
      let: { postCoordinates: '$location.coordinates.coordinates' },
      pipeline: [
        {
          $match: {
            boundries: {
              $geoIntersects: {
                $geometry: {
                  type: 'Point',
                  coordinates: '$$postCoordinates'
                }
              }
            }
          }
        }
      ],
      as: 'neighborhoods'
    }
  }
]);

1 Ответ

0 голосов
/ 12 сентября 2018

К сожалению, координаты не могут быть заполнены из поля документа.

Geospatial - это выражения запроса, а переменные $let разрешено использовать только в $match с вариантом $expr для выражений агрегации в $lookup конвейере.

Вы должны выполнить запрос в два этапа.

Первый шаг для получения координат для соответствующей записи.

var result =  db.posts.findOne({ _id: ObjectId('5a562e62100338001218dffa')},{ _id: 0, 'location':1});

Второй шаг для поиска точки в многоугольнике.

db.neighborhoods.find(
   {
     "boundries": {
       $geoIntersects: {
          $geometry: {
             type: "Point" ,
             coordinates: result.location.coordinates.coordinates
          }
       }
     }
   }
)
...