如何在Spring Data Mongo DB Aggregation中投影数组元素字段

时间:2018-07-30 15:31:03

标签: java spring mongodb spring-data spring-data-mongodb

如何使用以下文档样本在Spring Data MongoDB Aggregation中投影嵌入式数组元素字段,我尝试过:

  • project("customers.id")
  • project("customers.[].id")
  • project("customers.?.id")
  • project("$customers.id")

但是没有用。

没有投影的结果文档:

{
    "id": "group1",
    "name": "Default Identity Management",
    "warningThreshold": 900000,
    "tariffId": "TR_0001",
    "active": false,
    "customers": [
        {
            "id": "1",
            "name": "David",
            "properties": [
                {
                    "name": "phone",
                    "value": "678"
                }
            ],
            "roles": [
                "dev"
            ]
        },
        {
            "id": "2",
            "name": "Peter",
            "properties": [
                {
                    "name": "phone",
                    "value": "770"
                }
            ],
            "roles": [
                "techsales",
                "dev"
            ]
        }
    ]
}

这样的预期文档:

{
    "id" : "group1",
    "name" : "Group1",
    "tariffId" : "TR_0001",
    "warningThreshold" : 900000,
    "customers" : [
        {
            "id" : "1",
            "name" : "David",
            "properties" : [
                {
                    "name" : "phone",
                    "value" : "678"
                }
            ]
        },
        {
            "id" : "2",
            "name" : "Peter",
            "properties" : [
                {
                    "name" : "phone",
                    "value" : "770"
                }
            ]
        }
    ]
}

我想包含customers []。id,customers []。name,customers []。properties。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我已经尝试了一段时间,但是没有。另外,这里关于stackoverflow的其他帖子以及Internet上的其他地方都没有提供我所寻找的解决方案。

我的问题类似于原始作者的问题:有一个文档,其中的字段是文档数组。我想查询文档中的所有顶级字段,并从数组中的文档中排除单个字段。

在问题注释中的

s7vr答案对我有用!只是在这里重新发布,因为大多数人没有仔细阅读所有注释,这是一个非常有用的答案,这使我不必编写很多糟糕的代码! :D

AggregationOperation project = new AggregationOperation() {
    @Override
    public Document toDocument(AggregationOperationContext aggregationOperationContext) {
        return new Document("$project", new Document("arrayField.nestedFieldToExclude", 0));
    }
};

使用Lambda:

AggregationOperation project = aggregationOperationContext -> new Document("$project", new Document("arrayField.nestedFieldToExclude", 0));

总体管道:

Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.match(criteria),
    Aggregation.sort(Sort.Direction.DESC, "createdOn"),
    project);

我只希望有一种更干净的方法直接使用Spring MongoDB Data API,而不是将这种方法与lambda函数一起使用。

另外,请注意,从spring-data-mongodb 2.2版开始,方法AggregationOperation.toDocument(AggregationOperationContext aggregationOperationContext)已被弃用。