MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्प्रिंग बूट डेटा और MongoDB - फ़िल्टर उप-दस्तावेज़ सरणी क्वेरी

खैर, स्प्रिंग डेटा में इस तरह के प्रश्न 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 डिफ़ॉल्ट खाली कंस्ट्रक्टर होना चाहिए!




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB में डेटा स्टोर करने का कुशल तरीका:एम्बेडेड दस्तावेज़ बनाम व्यक्तिगत दस्तावेज़

  2. MongoDB शेयरिंग के लिए एक डेवलपर गाइड

  3. सी # से मोंगोडब तक डेटटाइम सही डालें

  4. MongoDB '.' का उपयोग करने की अनुमति नहीं दे रहा है कुंजी में

  5. मैं MongoDB में सभी दस्तावेज़ों के लिए एक फ़ील्ड का नाम कैसे बदल सकता हूँ?