Не каждая «новая» функция сразу превращается в уровни абстракции, такие как весна-монго.
Поэтому вместо этого все, что вам нужно сделать, это определить класс, который использует интерфейс AggregationOperation
, который вместо этого будет принимать объект BSON, указанный непосредственно как его содержимое:
public class CustomAggregationOperation implements AggregationOperation {
private DBObject operation;
public CustomAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
Затем вы можете использовать в своей агрегации следующее:
Aggregation aggregation = newAggregation(
match(
Criteria.where("username").is("user001")
),
new CustomAggregationOperation(
new BasicDBObject(
"$lookup",
new BasicDBObject("from", "NewFeedContent")
.append("localField","content.contentId")
.append("foreignField", "_id")
.append("as", "NewFeedContent")
)
)
)
Который показывает пользовательский класс, смешанный со встроенным помощником конвейера match()
.
Все, что происходит под каждым помощником, это то, что они сериализуются в представление BSON, например, с DBObject
в любом случае. Таким образом, конструктор здесь просто берет объект напрямую и возвращает его непосредственно из .toDBObject()
, что является стандартным методом интерфейса, который будет вызываться при сериализации содержимого конвейера.
person
Blakes Seven
schedule
22.03.2016