java—有没有一种方法可以通过使用mongodb聚合和投影来返回完全不同的数据结构?

ifmq2ha2  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(331)

假设我有以下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)].
ukqbszuj

ukqbszuj1#

你需要自动连接mongo模板。

@Autowired
private MongoTemplate mongoTemplate;
``` `$match` 匹配公司 `$addFields` 覆盖类别字段。因为我们在category中有动态键作为category,所以我们将使用 `$objectToArray` . 然后用profession list过滤数组。一旦我们过滤,它将给出数组。为了使它成为原来的形式,我们使用 `$arrayToObject` 因为spring数据没有提供任何 `$addFields` ,我们需要使用技巧将mongo shell查询转换为等价的java对象
方法是

public List test(List companies,List 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();

}

工作蒙哥Playground
注意:java代码没有经过测试。它是基于mongo查询编写的

相关问题