MongoDB: сопоставление точек из одной коллекции с полигонами из другой - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь сопоставить точки в одной коллекции с регионами, хранящимися в другой коллекции. Вот примеры документов.

Очки:

{ 
  "_id" : ObjectId("5e36d904618c0ea59f1eb04f"), 
  "gps" : { "lat" : 50.073288, "lon" : 14.43979 },  
  "timeAdded" : ISODate("2020-02-02T15:13:22.096Z") 
}

Регионы:

{
  "_id" : ObjectId("5e49a469afae4a11c4ff3cf7"), 
  "type" : "Feature", 
  "geometry" : { 
    "type" : "Polygon", 
    "coordinates" : [ 
      [ 
        [ -748397.88, -1049211.61 ], 
        [ -748402.77, -1049212.2 ],
        ... 
        [ -748410.41, -1049213.11 ], 
        [ -748403.05, -1049070.62 ]
      ] 
    ] 
  }, 
  "properties" : {  
    "Name" : "Region 1" 
  } 
}

И запрос, который я пытаюсь построить, выглядит примерно так:

db.points.aggregate([
  {$project: {
    coordinates: ["$gps.lon", "$gps.lat"]
  }}, 
  {$lookup: {
    from: "regions", pipeline: [
      {$match: {
        coordinates: {
          $geoWithin: {
            $geometry: {
              type: "Polygon", 
              coordinates: "$geometry.coordinates"
            }
          }
        }
      }}
    ], 
    as: "district"
  }}
])

Я получаю сообщение об ошибке:

assert: команда не выполнена: {

    "ok" : 0,
    "errmsg" : "Polygon coordinates must be an array",
    "code" : 2,
    "codeName" : "BadValue"

}: сбой агрегата

Я заметил структура документа $ geoWithin такая же, как и структура одного документа для каждого региона. Итак, я попробовал такой запрос:

db.points.aggregate([
  {$project: {
    coordinates: ["$gps.lon", "$gps.lat"]
  }}, 
  {$lookup: {
    from: "regions", pipeline: [
      {$match: {
        coordinates: {
          $geoWithin: "$geometry.coordinates"
        }
      }}
    ], 
    as: "district"
  }}
])

Ошибка была та же.

Я искал геоквартиры, но на удивление все найденные упоминания содержали документ региона * stati c вместо того, который был взят из коллекции , Поэтому я задаюсь вопросом - возможно ли когда-либо сопоставить точки с регионами, в которых обе коллекции документов не установлены c и взяты из БД?

1 Ответ

0 голосов
/ 18 февраля 2020

К сожалению, невозможно

Вы можете выполнить запрос ниже, если $geometry может работать с MongoDB Выражения агрегации .

db.points.aggregate([
  {
    $lookup: {
      from: "regions",
      let: {
        coordinates: [
          "$gps.lon",
          "$gps.lat"
        ]
      },
      pipeline: [
        {
          $addFields: {
            coordinates: "$$coordinates"
          }
        },
        {
          $match: {
            coordinates: {
              $geoWithin: {
                $geometry: {
                  type: "Polygon",
                  coordinates: "$geometry.coordinates"
                }
              }
            }
          }
        }
      ],
      as: "district"
    }
  }
])
...