如何使用两个并行数组优化mongo查询?

时间:2019-07-09 16:16:07

标签: mongodb mongodb-query pymongo

我有这样的查询:

xml_db.find(
    {
        'high_performer': {
            '$nin': [some_value]
        },
        'low_performer': {
            '$nin': [some_value]
        },
        'expiration_date': {
            '$gte': datetime.now().strftime('%Y-%m-%d')
        },
        'source': 'some_value'        
    }
)

我尝试使用这些字段创建索引,但出现错误:

  

pymongo.errors.OperationFailure:无法索引并行数组[low_performer] [high_performer]

那么,如何有效地运行此查询?

1 个答案:

答案 0 :(得分:1)

化合物索引的排序应遵循equality --> sort --> range规则。可以在this响应中找到对此的良好描述。

这意味着索引中的第一个字段为source,后跟范围过滤器(expiration_datelow_performerhigh_performer)。

您已经注意到,索引中不能包含“性能”字段之一,因为只能对单个数组进行索引。您应该利用对数据集的了解来确定哪个过滤器(low_performerhigh_performer)更具选择性,并选择要包含在索引中的过滤器。

假设high_performer更具选择性,剩下的唯一步骤是确定expiration_datehigh_performer之间的顺序。同样,您应该使用对数据集的了解来基于选择性进行此确定。

假设expiration_date更具选择性,那么要创建的索引将是:

{ "source" : 1, "expiration_date" : 1, "high_performer" : 1 }