Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 有没有一种方法可以通过使用mongodb聚合和预测返回完全不同的数据结构?_Java_Mongodb_Spring Boot_Spring Data Mongodb - Fatal编程技术网

Java 有没有一种方法可以通过使用mongodb聚合和预测返回完全不同的数据结构?

Java 有没有一种方法可以通过使用mongodb聚合和预测返回完全不同的数据结构?,java,mongodb,spring-boot,spring-data-mongodb,Java,Mongodb,Spring Boot,Spring Data Mongodb,假设我有以下结构的mongodb集合: mongodocument: _id: xxx A: "CLEYMAR_COMPANY" category: Object ENGINEER: Object ARQUITECT: Object 基于公司,职业可以为空 我想根据以下查询返回一个数据结构: 返回基于类别的结果集,该类别为给定的关键字列表,例如 ["CLEYMAR_COMPANY", "VI

假设我有以下结构的mongodb集合:

mongodocument:
   _id: xxx
    A: "CLEYMAR_COMPANY"
    category: Object
        ENGINEER: Object
        ARQUITECT: Object
基于公司,职业可以为空

我想根据以下查询返回一个数据结构:

返回基于类别的结果集,该类别为给定的关键字列表,例如

["CLEYMAR_COMPANY", "VIC_COMPANY"] 
以及一个类别列表,如

["ENGINEER", "ARQUITECT"]
结果:

ENGINEER_RESULT :  [ENGINEER(corresponding to CLEYMAR COMPANY)      ENGINEER(corresponding to VIC_COMPANY)]

 ARQUITECT_RESULT: [ARQUITECT(corresponding to VIC COMPANY)]. 
    
    

您需要自动连接mongo模板

@Autowired
private MongoTemplate mongoTemplate;
  • $match
    匹配公司
  • $addFields
    覆盖类别字段。由于我们在category中使用动态键作为category,因此我们将使用
    $objectToArray
    使用键值对将其设置为数组。然后使用专业列表过滤数组。一旦我们过滤,它将给出数组。为了使其成为原始形式,我们使用
    $arrayToObject
由于spring数据不提供任何
$addFields
,我们需要使用

方法是

public List<Object> test(List<String> companies,List<String> professions ) {

    Aggregation aggregation = Aggregation.newAggregation(
        match(Criteria.where("A").in(companies)),
        a-> new Document("$addFields",
                new Document("category",
                        new Document("$arrayToObject",
                            new Document("$filter"
                                new Document()
                                .append("input",new Document("$objectToArray","$category"))                     
                                .append("cond",
                                    new Document("$in",Arrays.asList("$$this.k",professions))
                                )
                            )
                        )                                       
            )
        )

    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();

}
公开列表测试(列表公司、列表职业){
Aggregation=Aggregation.newAggregation(
匹配(公司中的标准,其中“A”),
a->新文档(“$addFields”,
新文件(“类别”,
新文档(“$arrayToObject”,
新文档(“$filter”
新文件()
.append(“输入”,新文档(“$objectToArray”,“$category”))
.append(“cond”,
新文档(“$in”,Arrays.asList(“$$this.k”,professions))
)
)
)                                       
)
)
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE.build());
返回mongoTemplate.aggregate(聚合,mongoTemplate.getCollectionName(您的_COLLECTION.class),Object.class).getMappedResults();
}
工作


注意:java代码未经测试。它是基于工作mongo query编写的

Hi Varman感谢您的回答。第一个问题,新文档做什么?Java文档-文档的映射表示。所有迭代器都将按照插入顺序遍历元素,就像LinkedHashMap一样。