Я пытаюсь реализовать конвейер агрегации 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