首页 > 解决方案 > Spring Mongo DB - 根据数组中的匹配元素检索文档

问题描述

我是 mongo db 的新手

我有产品集合,它包含一系列productSeasons

{
"_id" : "999999999",
"brand" : "BR",
"division" : "331",
"department" : "3314"
"productSeasons" : [
    {
        "season" : "FA",
        "year" : "2020",
        "status" : "ACTIVE",
        "design": "DESIGN1"
    },
    {
        "season" : "FA",
        "year" : "2020",
        "status" : "ACTIVE",
        "design": "DESIGN2"
    },
    {
        "season" : "SU",
        "year" : "2020",
        "status" : "ACTIVE",
        "design": "DESIGN1"
    }
]
}

我想根据季节、年份、状态字段返回具有匹配数组元素的文档。我期待低于标准的输出,季节:FA,年份:2020,状态:ACTIVE 我正在使用 spring mongo db 聚合框架

{
"_id" : "999999999",
"brand" : "BR",
"division" : "331",
"department" : "3314"
"productSeasons" : [
    {
        "season" : "FA",
        "year" : "2020",
        "status" : "ACTIVE",
        "design": "DESIGN1"
    },
    {
        "season" : "FA",
        "year" : "2020",
        "status" : "ACTIVE",
        "design": "DESIGN2"
    }
]
}

我找不到正确的方法来创建具有多个字段、季节、年份、状态的 AggregationExpression

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(where("_id").in(ids)),
    Aggregation.project("brand","division","department")
            .and(
                ArrayOperators.Filter.filter("productSeasons")
                    .as("productSeason")
                    .by(**ComparisonOperators.Cmp.valueOf("productSeason.season").compareTo(prodSeason.getSeason())**)
            )
            .as("productSeasons")

);

提前致谢 :)

标签: mongodbaggregation-frameworkspring-data-mongodb

解决方案


如果您的MongoDB4.2.8Spring Data3.0.3.RELEASE,下面是创建Aggregate Expression的 Java 代码。

Criteria criteria = new Criteria();
Aggregation agg = Aggregation.newAggregation(
                   Aggregation.unwind("productSeasons"),
                   Aggregation.match(criteria.and("productSeasons.season").is("FA")
                           .and("productSeasons.year").is("2020")
                           .and("productSeasons.status").is("ACTIVE")), 
                   Aggregation.group("_id").push(Aggregation.ROOT).as("data"),
                   Aggregation.project("_id").and("data.brand").arrayElementAt(0).as("brand")
                                           .and("data.division").arrayElementAt(0).as("division")
                                           .and("data.department").arrayElementAt(0).as("department")
                                           .and("data.productSeasons").as("productSeasons")
                    );
AggregationResults<Product> products = mongoOps.aggregate(agg, "product", Product.class);

注意:- 您需要创建 2 个 DTO,Product.java是主类,ProductSeason.java是数组元素的类,以使上述代码正常工作。


推荐阅读