MongoDB查询疑问:为何含部分符合条件车辆的文档未被返回
正确的MongoDB查询方式解析
问题原因分析
你原来的查询存在两个关键问题:
- 字段位置错误:你写的
"state":1是在根文档层面匹配,但实际state是嵌套在driver_vehicles数组的子文档中。 - 逻辑匹配错误:
"driver_vehicles.vehicledates.trip_date": {$nin: ["Dec 1, 2022"]}的逻辑是要求所有车辆的所有行程日期都不能是"Dec 1, 2022",但你的需求是存在至少一辆车辆满足条件,所以这个逻辑正好相反。
正确查询语句
要实现「存在至少一辆满足无2022年12月1日行程且state:1的车辆」的查询需求,需要使用$elemMatch来组合子文档的多个匹配条件:
db.vehicle_list.find({ "driver_vehicles": { "$elemMatch": { "state": 1, "vehicledates.trip_date": { "$nin": ["Dec 1, 2022"] } } } })
查询逻辑说明
$elemMatch会遍历driver_vehicles数组,检查是否存在至少一个子文档同时满足两个条件:- 子文档的
state字段等于1 - 该子文档的
vehicledates数组中,没有任何一个trip_date等于"Dec 1, 2022"(空数组也满足此条件,因为没有元素匹配)
- 子文档的
- 这样就能正确匹配到driver为1的文档,因为Car1(空行程数组+state=1)和Car3(行程日期为Dec 2+state=1)都符合子文档的匹配条件。
内容的提问来源于stack exchange,提问作者Vishalraj Jadeja
相关产品推荐
相关产品推荐

