-
Type:
New Feature
-
Resolution: Done
-
Priority:
Minor - P4
-
None
-
Affects Version/s: 4.0.3
-
Component/s: Aggregation Framework, Geo
-
None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
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'
}
}
])