Я пытаюсь сопоставить точки в одной коллекции с регионами, хранящимися в другой коллекции. Вот примеры документов.
Очки:
{
"_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 и взяты из БД?