मैं निम्नलिखित क्वेरी को निष्पादित करने के लिए स्प्रिंग डेटा मोंगोडीबी का उपयोग करना चाहता हूं लेकिन मैं project ऑपरेशन पर अटक गया और मुझे इसके लिए कुछ मदद चाहिए।
अनुवाद करने के लिए यहां एक क्वेरी है:

db.getCollection("employee_salaries").aggregate([
    { $match: {
        salaries: {
            $elemMatch: { 
              "to_date": { $gte: "1985-01-01" } ,  
              "to_date": { $lte: "1986-01-01" }
            } 
        }
    }},
    { $project: {
        salaries: {
            $filter: {
                input: "$salaries",
                as: "salaries",
                cond: {$and: [
                    { $gte: ["$$salaries.to_date", "1985-01-01"]},
                    { $lt: ["$$salaries.to_date", "1986-01-01"]}
                ]}
            }
        }
    }},
    { $unwind: "$salaries"},
    { $group: {
        _id: "$null",
        "total_salary": { $sum: "$salaries.salary"}
    }}
])

और यहाँ ऐसा करने का मेरा प्रयास है:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SimpleService {

    private final MongoTemplate mongoTemplate;

    public Document aggregation() {

        MatchOperation matchOperation = match(Criteria.where("salaries").elemMatch(Criteria.where("to_date").gte("1985-01-01").lte("1986-01-01")));
        ProjectionOperation projectionOperation = project("salaries");
        // other operations
        UnwindOperation unwindOperation = unwind("salaries");

        Document rawResults = mongoTemplate.aggregate(newAggregation(
                matchOperation,
                // other operations...
        ), Salaries.class, String.class).getRawResults();

        return totalSalaryInOneYear;
    }
}
1
big_OS 12 सितंबर 2020, 14:06

1 उत्तर

सबसे बढ़िया उत्तर

आवश्यक आयात के साथ ProjectionOperation और GroupOperation के लिए कोड नीचे दिया गया है।

import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import org.springframework.data.mongodb.core.aggregation.BooleanOperators.And;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Gte;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Lt;

ProjectionOperation projectionOperation =  project().and(filter("salaries")
                 .as("salaries")
                 .by(And.and(Gte.valueOf("salaries.to_date").greaterThanEqualToValue("1985-01-01"),Lt.valueOf("salaries.to_date").lessThanValue("1986-01-01"))))
                 .as("salaries");

जैसा कि आप null द्वारा समूहबद्ध करते हैं, कोई आईडी पास करने की आवश्यकता नहीं है।

GroupOperation groupOperation = group().sum("salaries.salary").as("tot‌​al_salary");

यदि उपरोक्त काम नहीं करता है, तो आपको कुछ गैर-मौजूदा फ़ील्ड को group() विधि में पास करने की आवश्यकता है। सुनिश्चित करें कि पारित पैरामीटर आपके संग्रह का हिस्सा नहीं है।

GroupOperation groupOperation = group("NotAField").sum("salaries.salary").as("tot‌​al_salary");

कोई और समस्या, मुझे बताएं।

1
RLD 14 सितंबर 2020, 10:37