MongoDB:按日期字段搜索,按条件更新
MongoDB: Search by field with date and update it by condition
请告诉我如何满足以下条件 - 如果 info.startDate 字段中的时间不等于 00 小时,则将日期 (2021-05-27) 提前 1 天,设置00:00:00.000Z 的时间。我试图笨拙地通过 Mongock 获取集合的所有元素并通过 LocalDateTime 进行检查,但是我的堆溢出了,这是合乎逻辑的,因为集合很大。我如何通过 Mongock 或至少向 MongoDB 发出手动请求来执行此操作?到目前为止我只写了这个:
db.getSiblingDB("ervk_core").getCollection("supervision").updateMany(
{},
[
{
"$set": {
"info.startDate": {
"$cond": {
if: {
$eq: [
"$info.startDate",
(there should be a condition at midnight)
]
},
then: (here the day should be added to full and the time should be set to midnight)
}
}
}
}
])
我想使用 dateToString 按小时进行部分搜索,但据我了解,此功能只能用于聚合。
非常感谢你的帮助:)
如果您使用的是 Mongo 5.0+ 版,那么您可以使用 $dateTrunc and $dateAdd 轻松实现此目的,如下所示:
db.collection.updateMany(
{},
[
{
$set: {
"info.startDate": {
$cond: [
{
$ne: [
{
$hour: "$info.startDate"
},
0
]
},
{
$dateTrunc: {
date: {
$dateAdd: {
startDate: "$info.startDate",
unit: "day",
amount: 1
}
},
unit: "day",
}
},
"$info.startDate"
]
}
}
}
])
对于较旧的 Mongo 版本,这有点混乱,您应该使用 $dateFromParts 来创建新的日期对象,如下所示:
db.collection.updateMany(
{},
[
{
$set: {
"info.startDate": {
$cond: [
{
$ne: [
{
$hour: "$info.startDate"
},
0
]
},
{
$dateFromParts: {
"year": {
$year: {
$add: [
"$info.startDate",
86400000
]
}
},
"month": {
$month: {
$add: [
"$info.startDate",
86400000
]
}
},
"day": {
$dayOfMonth: {
$add: [
"$info.startDate",
86400000
]
}
},
"hour": 0,
"minute": 0,
"second": 0,
"millisecond": 0,
}
},
"$info.startDate"
]
}
}
}
])
请告诉我如何满足以下条件 - 如果 info.startDate 字段中的时间不等于 00 小时,则将日期 (2021-05-27) 提前 1 天,设置00:00:00.000Z 的时间。我试图笨拙地通过 Mongock 获取集合的所有元素并通过 LocalDateTime 进行检查,但是我的堆溢出了,这是合乎逻辑的,因为集合很大。我如何通过 Mongock 或至少向 MongoDB 发出手动请求来执行此操作?到目前为止我只写了这个:
db.getSiblingDB("ervk_core").getCollection("supervision").updateMany(
{},
[
{
"$set": {
"info.startDate": {
"$cond": {
if: {
$eq: [
"$info.startDate",
(there should be a condition at midnight)
]
},
then: (here the day should be added to full and the time should be set to midnight)
}
}
}
}
])
我想使用 dateToString 按小时进行部分搜索,但据我了解,此功能只能用于聚合。
非常感谢你的帮助:)
如果您使用的是 Mongo 5.0+ 版,那么您可以使用 $dateTrunc and $dateAdd 轻松实现此目的,如下所示:
db.collection.updateMany(
{},
[
{
$set: {
"info.startDate": {
$cond: [
{
$ne: [
{
$hour: "$info.startDate"
},
0
]
},
{
$dateTrunc: {
date: {
$dateAdd: {
startDate: "$info.startDate",
unit: "day",
amount: 1
}
},
unit: "day",
}
},
"$info.startDate"
]
}
}
}
])
对于较旧的 Mongo 版本,这有点混乱,您应该使用 $dateFromParts 来创建新的日期对象,如下所示:
db.collection.updateMany(
{},
[
{
$set: {
"info.startDate": {
$cond: [
{
$ne: [
{
$hour: "$info.startDate"
},
0
]
},
{
$dateFromParts: {
"year": {
$year: {
$add: [
"$info.startDate",
86400000
]
}
},
"month": {
$month: {
$add: [
"$info.startDate",
86400000
]
}
},
"day": {
$dayOfMonth: {
$add: [
"$info.startDate",
86400000
]
}
},
"hour": 0,
"minute": 0,
"second": 0,
"millisecond": 0,
}
},
"$info.startDate"
]
}
}
}
])