MongoDB使用gte条件删除数组内符合日期要求的对象失败咨询
问题原因
你遇到的情况有两个核心错误:
- JavaScript Date构造函数的月份计数规则错误
JavaScript中new Date(year, monthIndex, day)的monthIndex是从0开始计数的,0代表1月,9代表10月。你写的new Date(2021, 09, 13)实际生成的是2021年10月13日的日期对象,而你数据里的最晚日期是2021年9月15日,没有任何元素满足大于等于10月13日的条件,所以$pull没有移除任何数组元素。因为语句成功匹配到了UserId为5的文档,所以会返回更新成功1条的提示。 - 嵌套字段匹配规则错误
你写的{ DateFrom: { DateTime: { $gte: xxx } } }是要求数组元素的DateFrom对象完全匹配括号内的结构,也就是DateFrom只能有DateTime一个子字段,且值满足条件。但你实际的DateFrom还包含Ticks字段,所以这个写法无法匹配到任何数组元素。
解决方案
修正日期参数,同时改用点语法匹配嵌套字段即可,推荐两种写法:
写法1:修正Date构造参数
db.getCollection('attendance').update( { UserId: "5" }, { $pull: { 'Ranges': { 'DateFrom.DateTime': { $gte: new Date(2021, 8, 13) } } } } );
这里将月份参数改为8,对应实际的9月。
写法2:直接使用ISODate(更不容易出错)
db.getCollection('attendance').update( { UserId: "5" }, { $pull: { 'Ranges': { 'DateFrom.DateTime': { $gte: ISODate("2021-09-13T00:00:00.000Z") } } } } );
如果需要更新所有UserId为5的文档,可以在update方法中加入第三个参数开启批量更新:
db.getCollection('attendance').update( { UserId: "5" }, { $pull: { 'Ranges': { 'DateFrom.DateTime': { $gte: ISODate("2021-09-13T00:00:00.000Z") } } } }, { multi: true } );
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

