首页 > 解决方案 > 如何使用两个并行数组优化 mongo 查询?

问题描述

我有一个这样的查询:

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]

那么,如何高效地运行这个查询呢?

标签: mongodbmongodb-querypymongo

解决方案


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

这意味着索引中的第一个字段是source,然后是范围过滤器(expiration_datelow_performerhigh_performer

正如您所注意到的,“表演者”字段之一不能包含在索引中,因为只能索引一个数组。您应该使用您对数据集的了解来确定哪个过滤器 (low_performerhigh_performer) 将更具选择性,并选择要包含在索引中的过滤器。

假设这high_performer更具选择性,剩下的唯一步骤就是确定 和 之间的expiration_date顺序high_performer。同样,您应该使用您对数据集的了解根据选择性做出此决定。

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

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

推荐阅读