MongoDB大小写不敏感索引后PyMongo查询报AttributeError求助
解决PyMongo大小写不敏感查询的AttributeError问题
错误原因
你错误地将collation()方法链式调用在了find_one()的返回结果上。当查询无匹配文档时,find_one()会返回None,此时调用collation()自然触发AttributeError。而且PyMongo的find_one()方法本身不支持这种链式调用方式,collation应该作为查询参数传入,或者针对find()返回的游标使用。
正确实现方案
方案1:直接给find_one()传入collation参数
这是最直接的方式,把collation配置作为第三个参数传给find_one(),和你的索引规则保持一致:
placename = "BOLOGNA" query = {"placename": placename} res = mdbcoll.find_one( query, {"geonamesid": 1}, collation={"locale": "it", "strength": 2} )
方案2:使用find()游标配合collation()
如果需要处理多个结果,或者习惯链式调用,可以用find()返回游标后再设置collation,最后取第一个结果:
placename = "BOLOGNA" query = {"placename": placename} cursor = mdbcoll.find(query, {"geonamesid": 1}).collation({"locale": "it", "strength": 2}) res = cursor.first() # 取第一个匹配结果,无匹配时返回None
额外说明
你之前创建的大小写不敏感索引是正确的:
db.loc.createIndex({ placename: 1 }, { collation: { locale: "it", strength: 2 } })
其中strength:2会忽略大小写差异,locale:"it"适配意大利语的字符排序规则,能精准匹配意大利地名的大小写变体。
如果不想依赖索引,也可以用正则表达式实现大小写不敏感查询,但这种方式会跳过索引(无合适正则索引时),性能较差,仅适合小数据集:
placename = "BOLOGNA" query = {"placename": {"$regex": f"^{placename}$", "$options": "i"}} res = mdbcoll.find_one(query, {"geonamesid": 1})
这里用^和$确保精确匹配,避免部分匹配的情况。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

