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"
        ]
      }
    }
  }
])

Mongo Playground