mongodb - 如何使用两个并行数组优化 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]
那么,如何高效地运行这个查询呢?
解决方案
复合索引排序应遵循equality --> sort --> range
规则。可以在此响应中找到对此的良好描述。
这意味着索引中的第一个字段是source
,然后是范围过滤器(expiration_date
和low_performer
)high_performer
。
正如您所注意到的,“表演者”字段之一不能包含在索引中,因为只能索引一个数组。您应该使用您对数据集的了解来确定哪个过滤器 (low_performer
或high_performer
) 将更具选择性,并选择要包含在索引中的过滤器。
假设这high_performer
更具选择性,剩下的唯一步骤就是确定 和 之间的expiration_date
顺序high_performer
。同样,您应该使用您对数据集的了解根据选择性做出此决定。
假设expiration_date
更具选择性,那么要创建的索引将是:
{ "source" : 1, "expiration_date" : 1, "high_performer" : 1 }
推荐阅读
- xslt-2.0 - 如何在 XSLT 中为时间戳添加一个小时?
- java - RocksDB 时在算子(KeyedProcessFunction 和 RichMapFunction)之间共享状态
- java - 更改默认 Spring Integration DirectChannel 日志记录
- kubernetes - Zookeeper 在多次重启节点后抛出超时
- node.js - 如何使用 lambda 和 node 将生成的 PDF 上传到 s3?
- javascript - 用户在输入字段中输入数据并按下回车后触发事件
- reactjs - 在移动设备上使用 Formik 的 React-select 验证工作不正确
- javascript - 如何获取 MySQL 列的位置?
- kubernetes - 使用 Kustomize 为微服务管理 k8s 机密
- amazon-web-services - 如何通过 AWS CLI 更新 Amazon S3 存储桶策略?