खैर, स्प्रिंग डेटा में इस तरह के प्रश्न trivial
नहीं हैं ।
बुरी खबर:
स्प्रिंग डेटा रिपॉजिटरी में MongoDB Aggregation
का समाधान नहीं है . इसलिए, आप MongoRepository में ऐसा करने के लिए किसी भी तरीके को लागू नहीं कर सकते, जैसे aggregateBy...
खुशखबरी:
स्प्रिंग डेटा MongoTemplate
प्रदान करता है वर्ग जो आपको जटिल प्रश्नों को निष्पादित करने की अनुमति देता है, जैसे आप मानक MongoDB शेल में करेंगे।
इसलिए, जैसा कि आप केवल exclude
करना चाहते हैं उप-दस्तावेज़ जो किसी शर्त से मेल नहीं खाता, हमें कुल pipelines
. को परिभाषित करने की आवश्यकता है ।
मुझे लगता है:
zip codes are Numeric (In your example is string)
And, to exclude subdocument, we filter by `zip`
There is no any other filter
MongoDB एकत्रीकरण होगा:
db.person.aggregate([
{$unwind: "$address"},
{$match: {"address.zip": 12345}},
{$group: { _id: { "firstName":"$firstName", "lastName":"$lastName", _id:"$_id" }, address: { $push: "$address" } } },
{$project: {_id:0, "firstName":"$_id.firstName", "lastName":"$_id.lastName", "address": "$address"}}
])
यदि सभी फ़िल्टर सफलता प्राप्त करते हैं, तो हमें मिला:
[
{
"address" : [
{
"zip" : 12345
},
{
"zip" : 12345
}
],
"firstName" : "George",
"lastName" : "Washington"
}
]
अब, स्प्रिंग डेटा तरीके से, आपको अपनी परियोजना में कुछ बदलाव जोड़ने होंगे:
सबसे पहले, अपना mongo-config.xml
ढूंढें जहां आपको जोड़ने की जरूरत है:
<!-- Define the mongoDbFactory with your database Name -->
<mongo:db-factory uri="mongodb://user:[email protected]:27017/db"/>
<!-- Define the MongoTemplate -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
MongoTemplate
स्प्रिंग के MongoDB सपोर्ट का केंद्रीय वर्ग है जो डेटाबेस के साथ इंटरैक्ट करने के लिए फीचर सेट प्रदान करता है। टेम्प्लेट ...
आपके डोमेन ऑब्जेक्ट . के बीच मैपिंग प्रदान करता है और MongoDB दस्तावेज़ . अधिक जानकारी
दूसरा, आपके @Service
. में वर्ग, @PostConstruct
में लोड करने के लिए निम्नलिखित कोड जोड़ें
@Autowired
private MongoOperations mongoOperations;
...
public List<Person> findByAddressZipCode(int zip) {
List<AggregationOperation> list = new ArrayList<AggregationOperation>();
list.add(Aggregation.unwind("address"));
list.add(Aggregation.match(Criteria.where("address.zip").is(zip)));
list.add(Aggregation.group("firstName", "lastName").push("address").as("address"));
list.add(Aggregation.project("firstName", "lastName", "address"));
TypedAggregation<Person> agg = Aggregation.newAggregation(Person.class, list);
return mongoOperations.aggregate(agg, Person.class, Person.class).getMappedResults();
}
नोट: दोनों, Person
और Address
डिफ़ॉल्ट खाली कंस्ट्रक्टर होना चाहिए!