2

请告诉我如何满足以下条件 - 如果 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 按小时进行部分搜索,但据我了解,此功能只能在聚合中使用。

我会很感激你的帮助:)

4

1 回答 1

2

如果您使用的是 Mongo 5.0+ 版,那么您可以使用$dateTrunc$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"
        ]
      }
    }
  }
])

蒙戈游乐场

于 2022-02-27T18:47:16.460 回答