javascript - 按日期从 Mongo 文档中的数组中提取
问题描述
我试图通过使用 mongo 查询比较早于 60 天的 isodate 字符串来使用值从 mongo 文档中的数组中提取,但它没有从文档中的数组中提取数据。例如,在查询运行后,下面的文档应该只在日志数组中保留作业 3,但当前所有三个都保留。
文档
{
"_id" : "0jYHGDtEIaE3BCjBW",
"owner" : "a",
"logs" : [
{
"job" : "1",
"createdAt" : "2020-01-31T05:07:09.468Z"
},
{
"job" : "2",
"createdAt" : "2020-01-31T05:07:11.119Z"
},
{
"job" : "3",
"createdAt" : "2021-04-01T05:07:11.119Z"
}
]
}
代码
let deleteDate = new Date(Date.now() - 60 * 24 * 60 * 60 * 1000);
Logs.update(
{},
{
$pull: {
logs: {
createdAt: {
$gte: deleteDate,
},
},
},
},
{ multi: true }
);
预期结果
{
"_id" : "0jYHGDtEIaE3BCjBW",
"owner" : "a",
"logs" : [
{
"job" : "3",
"createdAt" : "2021-04-01T05:07:11.119Z"
}
]
}
解决方案
很少有修复,
createdAt
类型是集合中的字符串new Date
并将返回日期类型,因此条件将始终为假,您必须在其字符串或日期的两侧更改相同的类型,- 对于解决方案,您可以使用
toISOString()
afternew Date
函数将日期类型转换为字符串 - 我认为您使用了错误的条件运算符
$gte
,应该是$lte
您的最终查询是,
let deleteDate = new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString();
Logs.update(
{},
{
$pull: {
logs: {
createdAt: {
$lte: deleteDate
}
}
}
},
{ multi: true }
);
推荐阅读
- asp.net - Razor 页面忽略路由
- java - Java 泛型 - 定义方法只接受列表或映射
- java - 是否可以在 Spring Boot 中从其他项目中注入静态资源?
- python - ActiveMQ 消费者在一段时间后没有收听
- julia - 如何为 julia 中的重复列添加后缀或前缀?
- windows - Powershell 测试连接速度
- c# - 退出应用程序时保存 PlayerPrefs 的问题
- python - 如何使用 python 向多个文本文件添加不同的数据?
- jquery - 如何将捕获的视频保存到 asp.net 中的文件夹?
- spring - Spring Boot 2.3.1 重复的 Bean 定义