How to query PointField – MongoEngine

Question:

I was trying to update PointField in my flask app with upsert_one. But it always inserts new document. I know the problem is with the query which I’m passing.

Below is my model.

class Location(db.Document):
    location_name = db.StringField(required=True)
    geoCoords = db.PointField()

And the update query.

Location.objects(geoCoords=loc["geoCoords"]).upsert_one(location_name=loc["location_name"], geoCoords=loc["geoCoords"])
#loc["geoCoords"] = [77.6309395,12.9539974]

I also tried running get. But I’m getting the error message "Location matching query does not exist." for the below query.

loc = Location.objects(geoCoords=[77.6309395,12.9539974]).get()

I have following entries in my location collection.

> db.location.find()
{ "_id" : ObjectId("59c5019727bae70ad3259e67"), "geoCoords" : { "type" : "Point", "coordinates" : [ 77.6309395, 12.9539974 ] }, "location_name" : "Bengaluru" }
{ "_id" : ObjectId("59c5022d27bae70ad3259ea2"), "geoCoords" : { "type" : "Point", "coordinates" : [ 77.6309395, 12.9539974 ] }, "location_name" : "Bengaluru" }
>

I couldn’t find any related information on querying the PointFiled.

Asked By: James

||

Answers:

Try this:

Location.objects(geoCoords="...").update(location_name=loc["location_name"], geoCoords=loc["geoCoords"])
Answered By: Farhat Nawaz

To answer to my question. I think there is no way to get the exact points like I have mentioned in the question.

The nearest method works here is to use __near selector. This accepts the range in meters. So, you can give closest range query as per your requirement.

In my case, I gave 100 meters. Which is fine for me.

Example:

Location.objects(geoCoords__near=thelocation["geoCoords"], geoCoords__max_distance=100).upsert_one(location_name=thelocation["location_name"], geoCoords=thelocation["geoCoords"])
Answered By: James
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.