2017-11-09 25 views
7

Tôi có một hàm nhận Aggregation aggregation làm thông số.Spring Mongo> Cách lấy danh sách AggregationOperations from Aggregation

Tôi muốn nhận tất cả AggregationOperation từ aggregation. Có cách nào để làm điều đó?

public Aggregation newCustomAggregation(Aggregation aggregation, Criteria c) { 
    // How to get list operation aggregation there? 
    listOperation.push(Aggregation.match(c)); 
    return Aggregation 
      .newAggregation(listOperations); 
} 

Mục đích của tôi là mới khác Aggregation với tùy chỉnh của tôi MatchAggregation.

+0

Làm thế nào để bạn có kế hoạch sử dụng này 'newCustomAggregation' chức năng? – chridam

+0

Xin chào chridam, tôi muốn sử dụng nó để thêm tiêu chí động để lọc ra kết quả khi nhận nó như một tham số (tương tự như cách query.addCriteria (... myCriteria)) –

Trả lời

4

Bạn có thể tạo triển khai tập hợp tùy chỉnh của riêng mình bằng cách phân lớp tổng hợp để truy cập trường hoạt động được bảo vệ.

Something như

public class CustomAggregation extends Aggregation { 
     List<AggregationOperation> getAggregationOperations() { 
     return operations; 
    } 
} 

public Aggregation newCustomAggregation(Aggregation aggregation, Criteria c) { 
    CustomAggregation customAggregation = (CustomAggregation) aggregation; 
    List<AggregationOperation> listOperations = customAggregation.getAggregationOperations(); 
    listOperations.add(Aggregation.match(c)); 
    return Aggregation .newAggregation(listOperations); 
} 
+0

Điều này không trả lời được câu hỏi. Câu hỏi đặt ra là lấy danh sách 'AggregationOperation' từ một cá thể 'Aggregation'. Giải pháp này nhận danh sách 'AggregationOperation' chỉ từ một cá thể 'CustomAggregation'. Đối với bất kỳ 'Aggregation' nào khác, nó chỉ ném một' ClassCastException'. Tôi không thấy nhiều ý nghĩa trong điều đó. – jannis

+0

@jannis Như bạn đã lưu ý, không có cách nào để lấy trường 'hoạt động' từ lớp' Aggregation'. Tôi đã cung cấp câu trả lời nơi op có thể phân lớp lớp 'Aggregation' để truy cập trường' protected' 'operations' và phơi bày trường thông qua getter. Hãy cho tôi biết phần nào vẫn chưa rõ ràng. – Veeram

+0

Tôi không nói nó không rõ ràng. Tôi đang nói nó không trả lời câu hỏi. – jannis

2

Aggregation có thuộc tính operations sẽ cung cấp cho bạn tất cả hoạt động được áp dụng trong Aggregation.

protected List<AggregationOperation> allOperations = aggregation.operations ; 

sẽ cung cấp cho bạn tất cả các hoạt động được áp dụng.

+2

A) Nó không tĩnh. B) Nó được bảo vệ. – jannis

+0

Cảm ơn vì đã chú ý. Cập nhật câu trả lời của tôi –

+0

Tôi thấy nhưng không có phương pháp để có được tài sản này .. là có cách nào? –

4

Câu trả lời ngắn gọn: Không, không có cách nào tốt để làm điều đó.

Không có cách nào 'dễ dàng' nhận được danh sách AggregationOperation từ bên ngoài một thể hiện Aggregation-operations là một tài sản của Aggregation lớp bảo vệ.

Bạn có thể dễ dàng lấy nó với sự phản ánh nhưng mã như vậy sẽ dễ vỡ và tốn kém để duy trì. Có lẽ có lý do chính đáng để tài sản này được bảo vệ. Bạn có thể hỏi về điều này trong Spring-MongoDB's JIRA. Tôi cho rằng có một cách tiếp cận thay thế cho điều này.

Tất nhiên, bạn có thể thay đổi phương thức để lấy tập hợp AggregationOperation làm thông số nhưng có quá thông tin liitle trong bài viết của bạn để nói xem giải pháp này có khả thi trong trường hợp của bạn hay không.

Các vấn đề liên quan