如何在Java代码中使用MongoDB聚合过滤嵌套列表?
MongoDB聚合查询转Java代码:过滤嵌套数组字段
需求目标
- 过滤Item中的
prices数组,满足以下任一条件: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
相关产品推荐
相关产品推荐

