fgalan
fgalan

Reputation: 12322

Geo-query using a circle as area to match at least one of the points of MultiPoint object in MongoDB

I have the following document in the entities collection at Mongo (a 2dsphere index for location.coords is in place):

> db.entities.find({},{location: 1}).pretty()
{
    "_id" : {
        "id" : "en3",
        "type" : "t",
        "servicePath" : "/"
    },
    "location" : {
        "attrName" : "position",
        "coords" : {
            "type" : "MultiPoint",
            "coordinates" : [
                [
                    -3.691944,
                    40.418889
                ],
                [
                    4.691944,
                    45.418889
                ]
            ]
        }
    }
}

As far as I have checked, $geoWithin only matches when the geometry includes all the points of the MultiPoint, e.g:

> db.entities.find({"location.coords": { $geoWithin: { $centerSphere: [ [ -3.691944, 40.418889 ], 0.002118976612776644 ] } } })
// Small circle centered at first point, but without covering the second point: it doesn't matchh

> db.entities.find({"location.coords": { $geoWithin: { $centerSphere: [ [ -3.691944, 40.418889 ], 2 ] } } })
// Big circle centered at first point covering also the second point: it matches

However, I would like to have a query to match if at least one point of the MultiPoint matches. I have read about the $geoIntersects operator. I have tried just replace $geoWithin by $geoIntersect in my query, but it doesn't work:

> db.entities.find({"location.coords": { $geoIntersects: { $centerSphere: [ [ -3.691944, 40.418889 ], 0.002118976612776644 ] } } })
error: {
    "$err" : "Can't canonicalize query: BadValue bad geo query",
    "code" : 17287
}

Reading the $geoIntersects operator, it seems that it can be only used with polygons or multi-polygons, but it doesn't mention circles. I wonder if I'm missing something, because this "asymmetry" between $geoWithin and $geoIntersects seems to be a bit weird...

Thus, is there any way of doing a geo-query using a circle as area to match at least one of the points of MultiPoint object?

Upvotes: 2

Views: 530

Answers (1)

fgalan
fgalan

Reputation: 12322

I think I have found the answer at the end. It can be done with the $near operator, in the following way:

db.entities.find({"location.coords": { $near: { $geometry: { type: "Point", "coordinates": [ -3.691944, 40.418889 ] }, $maxDistance: 0.5 } }})

Upvotes: 1

Related Questions