mongodb - 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")
);
提前致谢 :)
解决方案
如果您的MongoDB是4.2.8而Spring Data是3.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是数组元素的类,以使上述代码正常工作。
推荐阅读
- ios - iOS Swift Canvas 绘图和框架功能
- laravel - Laravel Passport 如何无密码登录,只使用手机?
- powerbi - 在 Power BI 中创建折线图
- php - 重定向后 Laravel Auth 会话丢失(使用 Web 中间件)
- javascript - 搜索在反应中不像期望的那样工作
- python-3.x - 无法理解 opencv2 python 中的 dtype 错误
- c++ - 使用模数时如何解决 C++ 输出负数?
- javascript - 相邻的 JSX 元素必须包含在封闭标记中。你想要一个 JSX 片段 <>...?(57:2)
- assembly - 如何将.s 转换为.asm?
- regex - 如何在 laravel 中向 Sitemap.xml 添加正则表达式?