我需要使用具有特定排序规则集的索引来搜索Mongo数据库集合。但是,当我调用db[coll].find_raw_batches(filter=filter, collation=collation)
时,排序规则似乎并没有作为查找请求的一部分传播到服务器。我设法在隔离的环境中使用以下代码重现了这一点:
import pymongo
from pymongo import MongoClient
from pymongo.collation import Collation, CollationStrength
def main():
collection_name = 'test'
mongo_url = 'mongodb://localhost:27017' # some running mongo instance
client = MongoClient(mongo_url)
try:
db = client.get_database()
# drop existing collection
collection = db[collection_name]
collection.drop()
# create indexes
collection.create_index([('test', pymongo.TEXT)], language_override='index_lang', default_language='en')
collation = Collation('en', strength=CollationStrength.SECONDARY)
collection.create_index('not_text', collation=collation)
# run a dummy query
filter={'$or': [{'$text': {'$search': 'test text'}}, {'not_text': {'$eq': 'test not-text'}}]}
cursor = collection.find_raw_batches(filter=filter, collation=collation)
touch_cursor(cursor)
finally:
client.close()
def touch_cursor(cursor):
for item in cursor:
break
if __name__ == '__main__':
main()
这是我得到的错误:
pymongo.errors.OperationFailure: database error: error processing query: ns=test.testTree: $or
not_text $eq "test not-text"
TEXT : query=test text, language=english, caseSensitive=0, diacriticSensitive=0, tag=NULL
Sort: {}
Proj: {}
planner returned error: Failed to produce a solution for TEXT under OR - other non-TEXT clauses under OR have to be indexed as well.
如果我使用find
而不是find_raw_batches
,同样的事情也会起作用。我对documentation的阅读表明,find
和find_raw_batches
均应支持此功能,但是使用find_raw_batches
时,归类方式会丢失。
请注意,将排序规则索引与文本索引结合在一起只会使问题更加明显。在与上述相同的情况下,即使排序规则另有规定,对'not_text'
字段的查询也不会区分大小写。
所以我的问题是:我(我可以)如何做这项工作?