MongoDB查询字符串存储日期:筛选重复订单及指定日期后数据
问题分析与解决方案
原查询失败原因
你写的results: [{}, {}]属于数组精确匹配,MongoDB会要求目标数组的元素数量、顺序、内容和查询条件里的数组完全一致才会匹配。但你的实际results数组还有customer和patient相关的元素,所以自然查不到结果。
正确查询写法
要筛选出同时满足以下两个条件的文档:
results数组中存在一个元素满足a: 'order_info', b: 'description', result: 'repeat order'results数组中存在一个元素满足a: 'order_info', b: 'date', result >= 指定日期
可以用$elemMatch分别指定两个数组元素的匹配条件,MongoDB会自动判定为“数组中同时存在满足这两个条件的元素”:
db.orders.find({ // 匹配重复订单的数组元素 "results": { $elemMatch: { a: "order_info", b: "description", result: "repeat order" } }, // 匹配日期符合要求的数组元素 "results": { $elemMatch: { a: "order_info", b: "date", result: { $gte: "2022-01-01T00:00:00.000Z" } } } })
也可以用$and明确声明两个条件,效果完全一致:
db.orders.find({ $and: [ { "results": { $elemMatch: { a: "order_info", b: "description", result: "repeat order" } } }, { "results": { $elemMatch: { a: "order_info", b: "date", result: { $gte: "2022-01-01T00:00:00.000Z" } } } } ] })
关于日期字符串的说明
你的日期是标准ISO 8601格式的字符串,MongoDB的字符串比较会按照字符顺序进行,而ISO格式的字符串本身是严格按时间先后排序的,所以直接用$gte比较字符串完全可行,不需要将所有日期转换为Date类型,符合你的需求。
内容的提问来源于stack exchange,提问作者eldubleu
相关产品推荐
相关产品推荐

