You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java代码中使用MongoDB聚合过滤嵌套列表?

MongoDB聚合查询转Java代码:过滤嵌套数组字段

需求目标

  • 过滤Item中的prices数组,满足以下任一条件:
    1. validFor为空对象,或validFor.endDateTime晚于当前日期
  • 过滤prices下的alterations数组,仅保留finalPrice ≥ 110的项

示例JSON数据

{"id": 1,"prices": [{"priceName": "price1","validFor": {},"alterations": [{"alterationName": "alteration1","finalPrice": 110}]},{"priceName": "price2","validFor": {"endDateTime": "2024-10-31T12:00:00Z"},"alterations": [{"alterationName": "alteration2","finalPrice": 105},{"alterationName": "alteration3","finalPrice": 115}]}]}

对应的MongoDB原生聚合查询

[
  {
    "$project": {
      "id": 1,
      "prices": {
        "$filter": {
          "input": "$prices",
          "as": "price",
          "cond": {
            "$or": [
              {"$eq": ["$$price.validFor", {}]},
              {"$gt": [{"$dateFromString": {"dateString": "$$price.validFor.endDateTime","format": "%Y-%m-%dT%H:%M:%S%z"}}, new Date()]}
            ]
          }
        }
      }
    }
  },
  {
    "$project": {
      "id": 1,
      "prices": {
        "$map": {
          "input": "$prices",
          "as": "price",
          "in": {
            "$mergeObjects": [
              "$$price",
              {"alterations": {"$filter": {"input": "$$price.alterations","as": "alteration","cond": {"$gte": ["$$alteration.finalPrice",110]}}}}
            ]
          }
        }
      }
    }
  }
]

当前Java代码卡点

我已经能把聚合结果转成Item列表,但在实现聚合逻辑时,卡在字符串类型的endDateTime与当前日期的比较环节。目前写的代码片段如下:

aggregationOperations.add(Aggregation.project()
    .and(when(new Criteria().orOperator(
        new Criteria("price.validFor").is(new Document()),
        new Criteria("price.validFor.endDateTime").gt(new Date().toString())
    )).then(true).otherwise(false)).as("prices"));

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:35:04