Внедрение конвейерного агрегирования MongoDB в приложении JAVA с пружинной загрузкой - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь реализовать конвейер агрегации MongoDB в java.

один документ в коллекции выглядит следующим образом, и таких документов много.

_id: ObjectId(" ")
ID: 1
Name: "xyz"
A:[
   {
    _id: ObjectId(" ")
    AID: 1
    AName: "abc"
    B:[
       {
        _id: ObjectId(" ")
        BID: 1
        BName: "mno"
        C:[
           {
             _id: ObjectId(" ")
             CID: 1
             CName: "pqr"
           }
           {
             _id: ObjectId(" ")
             CID: 2
             CName:"jkl"
            }
           ] 
         }
        ]
      }
    ]

Из приведенной выше коллекции я пытаюсь получить B, сопоставляя где ID: 1 и AName: "ab c"

я использовал ниже Агрегацию, чтобы получить B

{
 "pipeline" :
 [
   { "$match" :
     {
       "ID" : 1,
       "A.AName": "abc"
      }
    },
    { "$unwind" :
     {
       "path" : "$A"
      }
    },
     { "$match" :
     {
       "A.AName": "abc"
      }
    },
    { "$unwind" :
     {
       "path" : "$A.B"
      }
    },
    { "$project" :
     {
       "B" : "$A.B"
      }
    }
  ]
}

Реализация вышеупомянутого конвейера агрегации в MongoDB Compass при сборе дает мне «B» из документа, подобного этому

B:[
       {
        _id: ObjectId(" ")
        BID: 1
        BName: "mno"
        C:[
           {
             _id: ObjectId(" ")
             CID: 1
             CName: "pqr"
           }
           {
             _id: ObjectId(" ")
             CID: 2
             CName:"jkl"
            }
           ] 
         }
        ]

, и я реализовал вышеуказанный конвейер в java, как показано ниже

у меня есть модель для A, B, C и D

public List<D> getB(Integer Id, String AName){

 List<AggrtigationOperation> lsit = new ArrayList<AggrigationOperation>();
 list.add(Aggrigation.match(Criteria.where("ID").is(Id).and("A.AName").is(AName);
 list.add(Aggrigation.unwind("A", true));
 list.add(Aggrigation.match(Criteria.where("A.AName").is(AName);
 list.add(Aggrigation.unwind("A.B", true));
 list.add(Aggrigation.project("A.B"));
 TypedAggregation<D> agg = Aggregation.newAggregation(D.class, list);

 return mongoTemplate.aggregation(agg, D.class, D.class).getMappedResult();
}

приведенный выше код возвращает только _id: как показано ниже

другие поля не отображаются в моем классе модели B и они приходят как NULL

, так как я использовал JsonInclude.Include.NON_NULL

, они не отображаются в моем выводе как NULL

{
 _id: ObjectId:" "
}

Но не возвращаются B

когда я попробовал mongoTemplate.aggregation(agg, D.class, D.class).getRawResults();

я могу видеть ожидаемый результат

Может кто-нибудь, пожалуйста, дайте мне знать, где я делаю неправильно и почему getMappingResults() не работает.

и как сопоставить мой результат с классом модели B

...