Java Spring框架中子文档数组字段中的过滤器数组
我正在尝试从Spring框架项目中MongoDB中的数组中获取元素 我已经找到了MongoDB shell的解决方案,但我不知道如何通过Spring.data.core.aggregation实现它,Spring不支持其中一个aggregation operator@addFields 谁能告诉我如何替换这个@addField,或者如何用另一种方式实现它?非常感谢你 MongoDB示例数据:Java Spring框架中子文档数组字段中的过滤器数组,java,spring,spring-data,aggregation-framework,spring-mongo,Java,Spring,Spring Data,Aggregation Framework,Spring Mongo,我正在尝试从Spring框架项目中MongoDB中的数组中获取元素 我已经找到了MongoDB shell的解决方案,但我不知道如何通过Spring.data.core.aggregation实现它,Spring不支持其中一个aggregation operator@addFields 谁能告诉我如何替换这个@addField,或者如何用另一种方式实现它?非常感谢你 MongoDB示例数据: { "_id" : 15, "items" : [ {
{
"_id" : 15,
"items" : [
{
"columns" : [
{
"title" : "hhh",
"value" : 10
},
{
"title" : "hahaha",
"value" : 20
}
]
},
{
"columns" : [
{
"title" : "hiii",
"value" : 50
}
]
}
]
}
预期结果:
{
"_id" : 15,
"items" : [
{
"columns" : [
{
"title" : "hahaha",
"value" : 20
}
]
},
{
"columns" : []
}
]
}
MongoDB外壳的解决方案:
let value = "hahaha";
db.coll.aggregate([
{
"$addFields": {
"items": {
"$map": {
"input": "$items",
"as": "item",
"in": {
"columns": {
"$filter": {
"input": "$$item.columns",
"as": "elt",
"cond": { "$eq": [ "$$elt.title", value ] }
}
}
}
}
}
}
}
])
MongoDB版本:3.4.1Spring版本:1.4.3您可以尝试以下操作,但需要使用1.8.5版本
Aggregation aggregation = newAggregation(
project("_id").and(new AggregationExpression() {
@Override
public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
DBObject filter = new BasicDBObject("input", "$$item.columns").append("as", "elt").append("cond",
new BasicDBObject("$eq", Arrays.<Object>asList("$$elt.title", "hahaha")));
DBObject map = new BasicDBObject("input", "$items").append("as", "item").append("in", filter);
return new BasicDBObject("$map", map);
}
}).as("items")
);
静态导入:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.mapItemsOf;
您可以尝试以下操作,但需要使用1.8.5版本
Aggregation aggregation = newAggregation(
project("_id").and(new AggregationExpression() {
@Override
public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
DBObject filter = new BasicDBObject("input", "$$item.columns").append("as", "elt").append("cond",
new BasicDBObject("$eq", Arrays.<Object>asList("$$elt.title", "hahaha")));
DBObject map = new BasicDBObject("input", "$items").append("as", "item").append("in", filter);
return new BasicDBObject("$map", map);
}
}).as("items")
);
静态导入:
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.mapItemsOf;
谢谢您的建议,但是更改版本对我来说太复杂了。Spring boot 1.4.3有Spring mongo db 1.9.6版本。所以第一个选择应该适合你。你试过了吗?谢谢你的建议,但是更改版本对我来说太复杂了。Spring boot 1.4.3有Spring mongo db 1.9.6版本。所以第一个选择应该适合你。你试过了吗?