Details
-
New Feature
-
Status: Closed
-
Minor - P4
-
Resolution: Done
-
4.0.3
-
None
-
None
Description
I have a collection of areas:
{ "_id" : 1, name: "Area 1", "geometry" : { type: "Polygon", coordinates: <coordinates>} } |
{ "_id" : 2, name: "Area 2", "geometry" : { type: "Polygon", coordinates: <coordinates>} } |
{ "_id" : 3, name: "Area 3", "geometry" : { type: "Polygon", coordinates: <coordinates>} } |
I want to aggregate this so that every area (document) returned has a property containing all other areas within it's boundaries.
The purpose is to be able to make holes in a polygon if other polygons are fully contained within it's boundaries.
Result example where Area 2 and Area 3 are contained within the boundaries of Area 1.
{ "_id" : 1, name: "Area 1", "geometry" : { type: "Polygon", coordinates: <coordinates>}, holes: [{ "_id" : 2, name: "Area 2" }, { "_id" : 3, name: "Area 3" }] } |
{ "_id" : 2, name: "Area 2", "geometry" : { type: "Polygon", coordinates: <coordinates>} } |
{ "_id" : 3, name: "Area 3", "geometry" : { type: "Polygon", coordinates: <coordinates>} } |
I have tried using the `$lookup` aggregate but it seems like $geoWithin isn't supported inside the pipeline with my `let` variable as input.
As i understand it I need to wrap `$geoWithin` part in a `$expr` to be able to use the `$$area_geometry` variable from the `let` statement but these operators doesn't seem compatible.
So far my query ended up like this, but obviously this doesn't work.
db.Areas.aggregate([
|
{
|
$lookup:
|
{
|
from: 'Areas', |
let: { area_geometry: "$geometry" }, |
pipeline: [
|
{
|
$match:
|
{
|
Geometry: {
|
$geoWithin: {
|
$geometry: $$area_geometry
|
}
|
}
|
}
|
},
|
{ $project: { geometry: 0 } } |
],
|
as: 'holes' |
}
|
}
|
])
|