हालांकि यह पुराना धागा है, लेकिन मुझे आशा है कि जिसने भी इस धागे को पाया है वह अब मोंगो रिपोजिटरी में मल्टी स्टेज/पाइपलाइन एकत्रीकरण (बिल्कुल निश्चित नहीं है कि इसे क्या कहते हैं) करने के लिए सुरक्षित रूप से कर सकता है। मोंगो टेम्पलेट के बिना ।
लेकिन अब, मैं यहाँ में बताए गए स्प्रिंग डॉक के अनुसार एग्रीगेशन पाइपलाइन करने में सक्षम हूँ
मेरा एकत्रीकरण mongoshell में इस तरह दिखता है:
db.getCollection('SalesPo').aggregate([
{$project: {
month: {$month: '$poDate'},
year: {$year: '$poDate'},
amount: 1,
poDate: 1
}},
{$match: {$and : [{year:2020} , {month:7}]
}}
,
{$group: {
'_id': {
month: {$month: '$poDate'},
year: {$year: '$poDate'}
},
totalPrice: {$sum: {$toDecimal:'$amount'}},
}
},
{$project: {
_id: 0,
totalPrice: {$toString: '$totalPrice'}
}}
])
जबकि मैं इसे MongoRepository में @Aggregation एनोटेशन में बदल देता हूं, नीचे इस तरह बन जाता हूं (मैं एपॉस्ट्रेफे को हटा रहा हूं और विधि पैरा के साथ भी बदल रहा हूं):
@Repository
public interface SalesPoRepository extends MongoRepository<SalesPo, String> {
@Aggregation(pipeline = {"{$project: {\n" +
" month: {$month: $poDate},\n" +
" year: {$year: $poDate},\n" +
" amount: 1,\n" +
" poDate: 1\n" +
" }}"
,"{$match: {$and : [{year:?0} , {month:?1}] \n" +
" }}"
,"{$group: { \n" +
" '_id': {\n" +
" month: {$month: $poDate},\n" +
" year: {$year: $poDate} \n" +
" },\n" +
" totalPrice: {$sum: {$toDecimal:$amount}},\n" +
" }\n" +
" }"
,"{$project: {\n" +
" _id: 0,\n" +
" totalPrice: {$toString: $totalPrice}\n" +
" }}"})
AggregationResults<SumPrice> sumPriceThisYearMonth(Integer year, Integer month);
मेरा दस्तावेज़ इस तरह दिखता है:
@Document(collection = "SalesPo")
@Data
public class SalesPo {
@Id
private String id;
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate poDate;
private BigDecimal amount;
}
और अनुमानों को होल्ड करने के लिए SumPrice वर्ग:
@Data
public class SumPrice {
private BigDecimal totalPrice;
}
मुझे आशा है कि यह उत्तर किसी की भी मदद कर सकता है मोंगोटेम्पलेट का उपयोग किए बिना mongorepository में एकत्रीकरण करने का प्रयास करें ।