2012-04-27 5 views
10

के रूप में सरणी में उप-दस्तावेज़ पुनर्प्राप्त करें मैं MongoDB के लिए बहुत नया हूं, और मैं इसे जावा ड्राइवर के साथ उपयोग कर रहा हूं।डीबीओब्जेक्ट्स

{ "_id" : ObjectId("4f7d2ba6fd5a306d82687d48"), "room" : "Den" } 
{ "_id" : ObjectId("4f7d2baafd5a306d82687d49"), "room" : "Foyer" } 
{ "_id" : ObjectId("4f7d2fdcfd5a306d82687d4a"), "room" : "Master Bedroom" } 
{ "_id" : ObjectId("4f7d301afd5a306d82687d4b"), "room" : "Guest Bedroom" } 
{ "_id" : ObjectId("4f7d2b98fd5a306d82687d47"), "code" : "A", "lights" : [ { "name" : "Overhead", "code" : "1" } ], "room" : "Kitchen" } 

कहाँ अंतिम पंक्ति को दर्शाता हुआ कि मैं क्या करना चाहते हैं में विशेष रुचि का है: मैं इस दस्तावेज़ संरचना है। प्रत्येक दस्तावेज़ एक कमरा है और उसमें एक "रोशनी" कुंजी हो सकती है जो उप-दस्तावेजों की एक सरणी है। मॉडलिंग परिप्रेक्ष्य से, मेरे पास एक घर है, जिसमें 0-एन कमरे हैं, जिनमें से प्रत्येक में 0-एन रोशनी है। मैं जावा में क्या करना चाहता हूं वह कमरे का नाम पैरामीटर के रूप में लेता है, और रोशनी सरणी में उप-दस्तावेजों के अनुरूप डीबीओब्जेक्ट का संग्रह वापस करता है - उदाहरण के लिए, "मुझे कमरे के लिए सभी रोशनी 'रसोईघर प्राप्त करें" ।

अब तक, TDD शैली में संवर्द्धित आगे बढ़ने से, मैं इस प्रश्न का निर्माण किया गया है:।

public static final String ROOM_KEY = "room"; 

public static final String EQUALS_KEY = "$eq"; 

private BasicDBObject buildRoomNameQuery(String roomName) { 

    BasicDBObject myQuery = new BasicDBObject(); 
    myQuery.put(ROOM_KEY, new BasicDBObject(EQUALS_KEY, roomName)); 

    return myQuery; 
} 

मुझे लगता है कि यह मेरे रूम का नाम मैं में पारित करने के लिए पूरे कमरे दस्तावेज़ प्राप्त करने के लिए जा रहा है मैं ' मैं यहां से आगे बढ़ने का सबसे अच्छा तरीका यह जानने के लिए थोड़ा सा अटक गया हूं कि मैं क्या चाहता हूं। क्या मैं एक साधारण क्वेरी के साथ भी संभव कर रहा हूं, या मुझे कोड में इसके माध्यम से सरणी को फिर से प्राप्त करना होगा और तत्वों को डीबीओब्जेक्ट के रूप में कास्टिंग करना होगा? मैं अपने उद्देश्य के लिए एक बेहतर दस्तावेज़ संरचना के लिए भी सुझावों के लिए खुला हूं - मैं इस संरचना से किसी भी माध्यम से शादी नहीं कर रहा हूं।

कुछ परिप्रेक्ष्य के लिए, मैं एसक्यूएल और पारंपरिक संबंधपरक डेटाबेस में काफी अच्छी तरह से जानता हूं, अगर यह स्पष्टीकरण संबंधी अनुरूपताओं के संदर्भ में मदद करता है। इसके अलावा, अगर मैं मोंगोडीबी शब्दावली को कुचल रहा हूं, तो कृपया मुझे सही करें। अग्रिम में धन्यवाद। उसे कुछ अतिरिक्त DBObjects से क्वेरी बनाने की तुलना में संक्षिप्त है - इसके अलावा, मैं जावा ड्राइवर में QueryBuilder का उपयोग करना चाहिये

DBCollection coll = db.getCollection("test"); 
BasicDBObject query = new BasicDBObject("room", "Kitchen"); 

// optional, limit the fields to only have the lights field 
BasicDBObject fields = new BasicDBObject("lights",1).append("_id",false); 
DBCursor curs = coll.find(query, fields); 
while(curs.hasNext()) { 
    DBObject o = curs.next(); 

    // shows the whole result document 
    System.out.println(o.toString()); 
    BasicDBList lights = (BasicDBList) o.get("lights"); 

    // shows the lights array -- this is actually a collection of DBObjects 
    System.out.println(lights.toString()); 

    // optional: break it into a native java array 
    BasicDBObject[] lightArr = lights.toArray(new BasicDBObject[0]); 
    for(BasicDBObject dbObj : lightArr) { 
    // shows each item from the lights array 
    System.out.println(dbObj); 
    } 
} 

,:

उत्तर

19

तो, आप कुछ इस तरह कर सकते हैं। इससे भी बेहतर, मॉर्फिया देखें, जो ऑब्जेक्ट मैपर है जो जावा ड्राइवर का उपयोग करता है। यह मूल रूप से इकाई मॉडल का समर्थन करता है जिनमें उनमें सूचियां होती हैं, और डीबीओब्जेक्ट सामग्री से निपटने के बिना उन्हें मोंगो को क्रमबद्ध/deserializes।

+0

संकेत के लिए धन्यवाद:

List<Document> comments = posts.get("comments", docClazz) 

जहां docClazz कुछ है कि आप एक बार बनाने के है! जब मैं घर जाता हूं तो यह अधिक जानकारी लेगा (यही वह जगह है जहां यह कोड है)। –

+1

मुझे QueryBuilder की धाराप्रवाह इंटरफ़ेस दिखाना पसंद है, और मॉर्फिया बहुत शक्तिशाली दिखता है। मुझे लगता है कि मैं आपके कोड नमूने में दृष्टिकोण के साथ चिपकने जा रहा हूं जब तक कि मुझे पता न हो कि मैं क्या कर रहा हूं और फिर शायद क्वेरीब्यूल्डर और फिर मॉर्फिया में प्रगति कर रहा हूं। मैं हमेशा इसे "पुराने तरीके से" समझना चाहता हूं और शॉर्टकट लेने से पहले मैं शॉर्टकटिंग कर रहा हूं। –

+0

यह काम नहीं करता है क्योंकि आप एक DDBject पर BasicDBList को नहीं डाल सकते हैं। – shreks7

1

वसंत मोंगो पैकेज को देखो। वास्तव में एक अच्छा तरीका POJO दस्तावेजों

http://www.springsource.org/spring-data/mongodb

का उपयोग कर मोंगो के साथ काम करने

1

आप क्षेत्रों के लिए एक iterator उपयोग कर सकते हैं आप कास्टिंग करते हैं और तार के साथ काम करने की जरूरत नहीं होगी

Iterator<DBObject> fields = curs.iterator(); 
      while(fields.hasNext()){ 
       DBObject field = (DBObject) fields.next().get("lights"); 
       System.out.println(field.get("name")); 
      } 
0

नए संस्करणों के लिए, Document के उपयोग पर विचार करें। अनियंत्रित डाले और लिंटर चेतावनी, साथ से बचने के लिए अपने स्वयं के पाश को लिखने के लिए, पुस्तकालय के get(final Object key, final Class<T> clazz) विधि का उपयोग करें:

final static Class<? extends List> docClazz = new ArrayList<Document().getClass();