Java 有没有一种方法可以通过使用mongodb聚合和预测返回完全不同的数据结构?
假设我有以下结构的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
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
覆盖类别字段。由于我们在category中使用动态键作为category,因此我们将使用$addFields
使用键值对将其设置为数组。然后使用专业列表过滤数组。一旦我们过滤,它将给出数组。为了使其成为原始形式,我们使用$objectToArray
$arrayToObject
$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一样。