MongoDB查询:如何筛选可容纳完整预约时段的working_range数组
MongoDB查询:匹配完全包含预约时段的可用区间
需求分析
我们需要从目标集合中筛选出满足以下条件的文档:其working_range数组中存在至少一个可用时段,能够完全包含指定的预约时段——即预约的起始秒数≥该可用时段的from值,且预约的结束秒数≤该可用时段的to值。
查询语句实现
假设指定的预约起始秒数为bookStart,结束秒数为bookEnd,对应的MongoDB查询语句如下:
db.collection.find({ working_range: { $elemMatch: { from: { $lte: bookStart }, to: { $gte: bookEnd } } } })
示例验证
针对你给出的测试场景,该查询的表现如下:
- 例1:预约时段26000秒至27000秒 → 匹配到
working_range中from=25000、to=50000的元素,返回对应文档。 - 例2:预约时段20000秒至27000秒 → 没有可用时段的
from值≤20000,无匹配结果。 - 例3:预约时段55000秒至65000秒 → 第一个可用时段的
to=50000小于65000,第二个可用时段的from=60000大于55000,无匹配结果。 - 例4:预约时段65000秒至70000秒 → 匹配到
working_range中from=60000、to=70000的元素,返回对应文档。
性能优化建议
如果集合数据量较大,为了提升查询效率,可以给working_range的from和to字段创建复合索引:
db.collection.createIndex({ "working_range.from": 1, "working_range.to": 1 })
内容的提问来源于stack exchange,提问作者Djordje Nikolic
相关产品推荐
相关产品推荐

