2017-12-12 8 views
0

Resful 웹 API에서 Java를 사용하여 graphlookup을 구현하는 방법을 찾고 있습니다. 나는 MongoDB를에 같은 계층 구조를 구현하기 위해 노력하고있어 (https://docs.mongodb.com/v3.4/reference/operator/aggregation/graphLookup/)

{ "_id" : 1, "name" : "Dev" } 
    { "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" } 
    { "_id" : 3, "name" : "Ron", "reportsTo" : "Eliot" } 
    { "_id" : 4, "name" : "Andrew", "reportsTo" : "Eliot" } 
    { "_id" : 5, "name" : "Asya", "reportsTo" : "Ron" } 
    { "_id" : 6, "name" : "Dan", "reportsTo" : "Andrew" } 

이, 내가 원하는 것은

{ 
    "_id" : 1, 
    "name" : "Dev", 
    "reportingHierarchy" : [ ] 
} 
{ 
    "_id" : 2, 
    "name" : "Eliot", 
    "reportsTo" : "Dev", 
    "reportingHierarchy" : [ 
     { "_id" : 1, "name" : "Dev" } 
    ] 
} 
{ 
    "_id" : 3, 
    "name" : "Ron", 
    "reportsTo" : "Eliot", 
    "reportingHierarchy" : [ 
     { "_id" : 1, "name" : "Dev" }, 
     { "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" } 
    ] 
} 

I MongoDB를

에 저장이 구조를 만들 수 있도록 직원 모음입니다 집계에 대해이 같이 볼 예를했습니다,하지만 아무것도 이런 형식으로 graphlookup 얻을 수있는 방법이 있나요 graphlookup

Aggregation agg = newAggregation(
     match(Criteria.where("pageId").is("2210")), 
     unwind("postIds"), 
     group("_id").sum("1").as("sum") 
     //project("$sum").and("pageId").previousOperation() 
    ); 

에 '? 여기서 match, unwind, group을 사용하는 대신 GraphLookupOperation을 사용하고 get map result와 같은 것을 사용할 수 있습니다.

답변

0

아래 코드를 시도해 볼 수 있습니다.

GraphLookupOperation graphLookupOperation = GraphLookupOperation.builder() 
    .from("employees") 
    .startWith("reportsTo") 
    .connectFrom("reportsTo") 
    .connectTo("name") 
    .as("reportingHierarchy"); 
Aggregation aggregation = Aggregation.newAggregation(graphLookupOperation); 
List<Document> results = mongoOperations.aggregate(aggregation, "employees", Document.class).getMappedResults() 
+0

이것은 좋지만 .as에는 오류가 있으며 액세스 할 수 없다고 말합니다. – Andrew

+0

1.10.6 spring mongo에서 그런 오류가 발생하지 않습니다. 현재 사용중인 스프링 몽고 버전은 무엇입니까? – Veeram

0
AggregationOperation aggregationOperation = new AggregationOperation() { 
     @Override public DBObject toDBObject(AggregationOperationContext aggregationOperationContext) { 
      DBObject graphLookup = new BasicDBObject(
        "from", "individual").append(
        "startWith", "$reportsTo").append(
        "connectFromField", "reportsTo").append(
        "connectToField", "firstName").append(
        "maxDepth", 2).append(
        "as", "reportingHierarchy"); 
      return new BasicDBObject("$graphLookup", graphLookup); 

이 코드는 내가 이전 버전을 사용하고 있기 때문에 해결이 가능, 나는 1.10.0 스프링 몽고 생각합니다. 이제는 내가 원하는 것처럼 보이지 않는 "reportingHierarchy"문제가 있습니다. 그것은 내게 이름을 부여하지 않습니다. 내가보고 싶지 않은 _class도 포함하는 reportsTo 및 reportingHierarchy.

관련 문제