данные Spring mongodb: запрос graphlookup не содержит as-field - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь выполнить этот запрос весной данных mongoDB:

db.myCollection.aggregate(
    [ 
        { "$graphLookup": { 
            "from": "myCollection", 
            "startWith": "$name", 
            "connectFromField": "name", 
            "connectToField": "parent", 
            "as": "descendants"
        }},
        { "$match": { "name": "someValue" } }, 
    ]
)

   GraphLookupOperation graphLookupOperation = GraphLookupOperation.builder()                    .from(mongoOperations.getCollectionName(MyCollection.class))
                    .startWith("name")
                    .connectFrom("name")
                    .connectTo("parent")
                    .as("descendants");
            MatchOperation matchStage = Aggregation.match(new Criteria("name").is("someValue));
            Aggregation aggregation = Aggregation.newAggregation(graphLookupOperation, matchStage);
            List<ClassDefinitionDocument> results = mongoOperations.aggregate(aggregation, mongoOperations.getCollectionName(MyCollection.class), MyCollection.class).getMappedResults();

Однако в списке results нет поля descendants. Запрос javascript отлично работает в оболочке mongo.

Что я делаю не так?

1 Ответ

0 голосов
/ 30 апреля 2018

Я получил свою работу. Вы можете попробовать это, чтобы заставить его работать на вас.

TypedAggregation - это специальная агрегация, которая содержит информацию о тип агрегации ввода.

public void graphLookupShouldBeAppliedCorrectly() {

    assumeTrue(mongoVersion.isGreaterThanOrEqualTo(THREE_DOT_FOUR));

    Employee em1 = Employee.builder().id(1).name("Dev").build();
    Employee em2 = Employee.builder().id(2).name("Eliot").reportsTo("Dev").build();
    Employee em4 = Employee.builder().id(4).name("Andrew").reportsTo("Eliot").build();

    mongoTemplate.insert(Arrays.asList(em1, em2, em4), Employee.class);

    TypedAggregation<Employee> agg = Aggregation.newAggregation(Employee.class,
            match(Criteria.where("name").is("Andrew")), //
            Aggregation.graphLookup("employee") //
                    .startWith("reportsTo") //
                    .connectFrom("reportsTo") //
                    .connectTo("name") //
                    .depthField("depth") //
                    .maxDepth(5) //
                    .as("reportingHierarchy"));

    AggregationResults<Document> result = mongoTemplate.aggregate(agg, Document.class);

    Document object = result.getUniqueMappedResult();
    List<Object> list = (List<Object>) object.get("reportingHierarchy");

    assertThat(object, isBsonObject().containing("reportingHierarchy", List.class));
    assertThat((Document) list.get(0), isBsonObject().containing("name", "Dev").containing("depth", 1L));
    assertThat((Document) list.get(1), isBsonObject().containing("name", "Eliot").containing("depth", 0L));
}
...