Fixed $maxDistance location for geoJSON $near queries with MongoDB 2.6+

Closes #664
This commit is contained in:
Ross Lawley 2014-06-26 17:13:35 +01:00
parent da0a1bbe9f
commit cfc31eead3

View File

@ -3,6 +3,7 @@ from collections import defaultdict
import pymongo import pymongo
from bson import SON from bson import SON
from mongoengine.connection import get_connection
from mongoengine.common import _import_class from mongoengine.common import _import_class
from mongoengine.errors import InvalidQueryError, LookUpError from mongoengine.errors import InvalidQueryError, LookUpError
@ -115,14 +116,21 @@ def query(_doc_cls=None, _field_operation=False, **query):
if key in mongo_query and isinstance(mongo_query[key], dict): if key in mongo_query and isinstance(mongo_query[key], dict):
mongo_query[key].update(value) mongo_query[key].update(value)
# $maxDistance needs to come last - convert to SON # $maxDistance needs to come last - convert to SON
if '$maxDistance' in mongo_query[key]: value_dict = mongo_query[key]
value_dict = mongo_query[key] if ('$maxDistance' in value_dict and '$near' in value_dict and
isinstance(value_dict['$near'], dict)):
value_son = SON() value_son = SON()
for k, v in value_dict.iteritems(): for k, v in value_dict.iteritems():
if k == '$maxDistance': if k == '$maxDistance':
continue continue
value_son[k] = v value_son[k] = v
value_son['$maxDistance'] = value_dict['$maxDistance'] if (get_connection().max_wire_version <= 1):
value_son['$maxDistance'] = value_dict['$maxDistance']
else:
value_son['$near'] = SON(value_son['$near'])
value_son['$near']['$maxDistance'] = value_dict['$maxDistance']
mongo_query[key] = value_son mongo_query[key] = value_son
else: else:
# Store for manually merging later # Store for manually merging later