MongoDB $geoIntersects查询在客户端正常但PyMongo运行报错
问题成因
你的代码报错核心是MongoDB Shell语法和Python语法的差异,附带几个基础语法错误:
- 你在Compass、Studio 3T中写的是JavaScript格式的MongoDB查询,JS环境中对象键可以不加引号,但在Python中,MongoDB查询需要以字典格式传入,所有字段名、
$开头的操作符(包括$geoIntersects、$geometry)都必须加引号作为字典的键。你当前代码中直接写裸的geometry、$geoIntersects,Python会将其识别为未定义的变量,直接抛出NameError,查询根本不会发送到MongoDB服务端。 count_documents()方法要求必须传入查询过滤器参数,统计集合全量文档数时需要传入空字典{},你当前无参数调用会触发参数缺失错误。found_count是整数类型,直接和字符串做拼接会触发类型错误,需要先转成字符串格式。- 异常捕获块中直接拼接异常对象也会触发类型错误,需要先将异常对象转为字符串。
修正后代码
import pymongo # 数据库连接配置 dbStartc = 'mongodb+srv://' dbDomain = '@cluster0.o7cud.azure.mongodb.net' dbUser = 'redacted' dbPass = 'redacted' dbName = 'redacted' dbColl = 'redacted' dbSettings = '/?retryWrites=true&w=majority' dbName_connected = False dbColl_connected = False try: # 建立MongoDB连接 mongoURL = dbStartc + dbUser + ':' + dbPass + dbDomain + dbSettings mongocon = pymongo.MongoClient(mongoURL) # 连接目标数据库 dblist = mongocon.list_database_names() if dbName in dblist: mongocdb = mongocon[dbName] dbName_connected = True # 连接目标集合 collist = mongocdb.list_collection_names() if dbColl in collist: mongocol = mongocdb[dbColl] dbColl_connected = True if dbName_connected and dbColl_connected: find_result = [] # 统计文档总数:传入空字典作为全量统计条件 found_count = mongocol.count_documents({}) if found_count > 0: # 整数转字符串后再做拼接 print("Collection Document Count: " + str(found_count)) # 构造地理空间查询:所有字典键加引号,符合Python语法 geo_query = { "geometry": { "$geoIntersects": { "$geometry": { "type": "Polygon", "coordinates": [ [ [-2.44783, 52.67930], [-2.44233, 52.67753], [-2.44560, 52.67430], [-2.45092, 52.67612], [-2.44783, 52.67930] ] ] } } } } mydoc = mongocol.find(geo_query) for doc in mydoc: find_result.append(doc) print(find_result) else: print("MongoDB Service - Connection Checks Failed") except Exception as ex: # 异常对象转字符串后拼接 print("Something you were not expecting went wrong! (" + str(ex) + ")")
补充排查点
如果修正语法后仍然查询失败,先确认目标集合的geometry字段已经创建了2dsphere地理空间索引,$geoIntersects地理查询要求关联字段必须存在对应索引才能正常执行。
内容的提问来源于stack exchange,提问作者Minty
相关产品推荐
相关产品推荐

