Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring框架中子文档数组字段中的过滤器数组_Java_Spring_Spring Data_Aggregation Framework_Spring Mongo - Fatal编程技术网

Java Spring框架中子文档数组字段中的过滤器数组

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" : [ {

我正在尝试从Spring框架项目中MongoDB中的数组中获取元素

我已经找到了MongoDB shell的解决方案,但我不知道如何通过Spring.data.core.aggregation实现它,Spring不支持其中一个aggregation operator@addFields

谁能告诉我如何替换这个@addField,或者如何用另一种方式实现它?非常感谢你

MongoDB示例数据:

{
    "_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.1

Spring版本: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版本。所以第一个选择应该适合你。你试过了吗?