0

我对 MongoDb 和 Spring-data-Mongo 还很陌生。经过大量研究后,我能够使用以下查询在 MongoDB 中获得所需的结果,但现在我发现在 Spring-data-Mongo 模板中实现相同的逻辑非常困难。

逻辑很简单:

我在文档中有 2 个日期字段和 2 个整数字段。

expireLastModifiedD(整数表示天数),expireLastUsedD:(整数,表示天数),lastModified:(日期类型),lastUsed:(日期类型)。

我需要找到满足以下表达式的文档。

lastModified+expireLastModifiedD < NOW && lastUsed + expireLastUsedD < NOW

我已经创建了一个 MongoDB 查询,如下所示。

[
  {
    $project: {
      expireLastModifiedD: 1,
      expireLastUsedD: 1,
      lastModified: 1,
      lastUsed: 1,
      NowSubtractLastModified: {
        $toInt: {
          $divide: [
            {
              $subtract: [
                new ISODate(),
                "$lastModified"
              ]
            },
            1000 * 60 * 60 * 24
          ]
        }
      },
      NowSubtractLastused: {
        $toInt: {
          $divide: [
            {
              $subtract: [
                new ISODate(),
                "$lastUsed"
              ]
            },
            1000 * 60 * 60 * 24
          ]
        }
      }
    }
  },
  {
    $project: {
      expireLastModifiedD: 1,
      expireLastUsedD: 1,
      lastModified: 1,
      lastUsed: 1,
      NowSubtractLastModified: 1,
      NowSubtractLastused: 1,
      isExpireLastModifiedDLTNowSubtractLastModified: {
        $lt: [
          "$expireLastModifiedD",
          "$NowSubtractLastModified"
        ]
      },
      isExpireLastUsedDLTNowSubtractLastused: {
        $lt: [
          "$expireLastUsedD",
          "$NowSubtractLastused"
        ]
      }
    }
  },
  {
    $match: {
      isExpireLastModifiedDLTNowSubtractLastModified: true,
      isExpireLastUsedDLTNowSubtractLastused: true
    }
  }
]

我需要使用聚合在 Spring-data Mongo 模板中创建上述 MongoDb 查询的帮助。

4

1 回答 1

0

经过大量研究,我想通了。

    Instant now = Instant.now();
    Timestamp current = Timestamp.from(now);

    ProjectionOperation projectionOperation = Aggregation.project("lastUsed", "expireLastUsedD", "lastModified", "expireLastModifiedD")
            .andExpression("([0] - lastModified)", current).divide(24 * 60 * 60 * 1000).as("lastModifiedFromNowD")
            .andExpression("([0] - lastUsed)", current).divide(24 * 60 * 60 * 1000).as("lastUsedFromNowD");

    ProjectionOperation projectionOperation1 = Aggregation.project("lastUsed", "expireLastUsedD", "lastModified", "expireLastModifiedD", "lastModifiedFromNowD", "lastUsedFromNowD")
            .andExpression("expireLastModifiedD < lastModifiedFromNowD").as("isExpLstModLTLastModFromNowD")
            .andExpression("expireLastUsedD < lastUsedFromNowD").as("isExpLstUsdLtLstUsdFromNowD");

    MatchOperation matchOperation = Aggregation.match(new Criteria().andOperator(
            Criteria.where("isExpLstModLTLastModFromNowD").is(true), Criteria.where("isExpLstUsdLtLstUsdFromNowD").is(true)));

    TypedAggregation<UrlMap> agg = Aggregation.newAggregation(UrlMap.class,
            projectionOperation, projectionOperation1, matchOperation);
于 2021-06-24T14:32:31.603 回答