如何在find_raw_batches查询上设置排序规则

时间:2019-02-05 05:03:30

标签: mongodb pymongo

我需要使用具有特定排序规则集的索引来搜索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的阅读表明,findfind_raw_batches均应支持此功能,但是使用find_raw_batches时,归类方式会丢失。

请注意,将排序规则索引与文本索引结合在一起只会使问题更加明显。在与上述相同的情况下,即使排序规则另有规定,对'not_text'字段的查询也不会区分大小写。

所以我的问题是:我(我可以)如何做这项工作?

0 个答案:

没有答案