2012-04-23 12 views
9

जो मैं करने की कोशिश कर रहा हूं वह मेटाडेटा के क्षेत्र से पूछताछ करके ग्रिडएफएस फाइलों की एक सूची ला रहा है। उदाहरण के लिए मैं एक GridFS फ़ाइल दस्तावेज़ मिल की तरह लग रही:मोंगोडीबी ग्रिडएफएस मेटाडाटा (जावा) पर प्रश्न

{ "_id" : { "$oid" : "4f95475f5ef4fb269dbac954"} , "chunkSize" : 262144 , "length" : 3077 , "md5" : "f24ea7ac05c5032f08808c6faabf413b" , "filename" : "file_xyz.txt" , "contentType" : null , "uploadDate" : { "$date" : "2012-04-23T12:13:19.606Z"} , "aliases" : null , "metadata" : { "target_field" : "abcdefg"}} 

और मैं युक्त "target_field" = "abcdefg" सभी फाइलों क्वेरी करना चाहते हैं। मैंने अपनी क्वेरी निम्नानुसार बनाई:

BasicDBObject query = new BasicDBObject("metadata", new BasicDBObject("target_field", "abcdefg")); 
// gridFS Object Initialization skipped 
List<GridFSDBFile> files = gridFs.find(query); 

सूची हमेशा खाली है। अन्यथा फ़ाइल नाम या uploadDate पूछताछ पूरी तरह से काम करता है। क्या नेस्टेड विशेषताओं द्वारा ग्रिडएफएस फाइलों को प्राप्त करना संभव नहीं है?

+0

यह संभवतः आप कुछ गलत वर्तनी हो सकता है? यह मेरी मशीन पर ठीक काम करता है। मैं जावा ड्राइवर के लिए mongod 2.0.4 और v2.7.3 का उपयोग कर रहा हूँ। – Ren

उत्तर

15

दुर्भाग्य से मुझे इसे नेस्टेड बेसिक डीबीबीजेक्ट्स के साथ काम करने के लिए नहीं मिला।

// This query fetches the files I need 
BasicDBObject query = new BasicDBObject("metadata.target_field", "abcdefg")); 
List<GridFSDBFile> files = gridFs.find(query); 
+1

अपने स्वयं के प्रश्न का उत्तर देने के लिए धन्यवाद। मेरे पास एक समान परिस्थिति थी और आपके जवाब ने मुझे हल करने में मदद की। –

0

MongoDB प्रलेखन से (http://docs.mongodb.org/manual/tutorial/query-documents/#exact-match-on-the-embedded-document):

अंत में मैं डॉट नोटेशन जो ठीक काम करता है उपयोग कर रहा था

सटीक मिलान एंबेडेड दस्तावेज़

पर पर एक समानता मैच निर्दिष्ट करने के लिए संपूर्ण एम्बेडेड दस्तावेज़, क्वेरी दस्तावेज़ का उपयोग करें {:} मिलान करने के लिए दस्तावेज़ कहां है। एम्बेडेड दस्तावेज़ पर समानता मिलान फ़ील्ड ऑर्डर सहित निर्दिष्ट सटीक मिलान की आवश्यकता होती है।

समानता मैच फील्ड्स पर एक एंबेडेड दस्तावेज़

भीतर एक एम्बेडेड दस्तावेज़ में विशिष्ट फ़ील्ड से मिलान करने के लिए डॉट नोटेशन का प्रयोग करें। एम्बेडेड दस्तावेज़ में विशिष्ट फ़ील्ड के लिए समानता मिलान संग्रह में दस्तावेज़ों का चयन करेंगे जहां एम्बेडेड दस्तावेज़ में निर्दिष्ट मान वाले निर्दिष्ट फ़ील्ड होते हैं। एम्बेडेड दस्तावेज़ में अतिरिक्त फ़ील्ड हो सकते हैं।


मैं के लिए एक सरल कोड "दस्तावेज़ अंकन" "बिंदीदार संकेत" में अनुवाद कर लिखा था। मुझे उम्मीद है कि यह उपयोगी है।

protected static void toDottedJson(Object o, String key, DBObject query) { 
    if (o instanceof Map) 
     for (Entry<?, ?> c : ((Map<?, ?>) o).entrySet()) 
      toDottedJson(c.getValue(), key + "." + c.getKey().toString(), 
        query); 
    else 
     query.put(key, o.toString()); 
} 

public static DBObject buildMetadataSearchQuery(DBObject searchQuery) { 
    BasicDBObject metadatSearchQuery = new BasicDBObject(); 
    for (Entry<?, ?> c : ((Map<?, ?>) searchQuery).entrySet()) 
     toDottedJson(c.getValue(), "metadata." 
       + c.getKey().toString(), 
       metadatSearchQuery); 
    return metadatSearchQuery; 
} 

उद्देश्य के लिए:

List<GridFSDBFile> files = gridFs.find(buildMetadataSearchQuery(new BasicDBObject("target_field", "abcdefg"))); 
+0

इस कोड का उपयोग करते समय सावधान रहें। यह '$ in'' या '$ nin' जैसे ऑपरेटरों समेत संपूर्ण क्वेरी को फ़्लैट करता है। मैं विकास टीम की सैनिटी के लिए विश्वास करता हूं, इससे बचा जाना चाहिए और शुरुआत से डॉट नोटेशन में लिखित प्रश्नों से बचा जाना चाहिए। – madmuffin

0

सरल:

GridFSDBFile gridFile = fsDocs.findOne(new BasicDBObject("md5","1b21bc40a456befc7d2ee10b0e25fabf")); 
+2

शायद आप यह बता सकते हैं कि पाठकों को स्पॉट करने की कोशिश करने के बजाए, यह कोड बेहतर या सरल कैसे है, जैसा कि आप कहते हैं? –

+0

समस्या को अपने एमडी 5 कोड द्वारा फ़ाइल लाने के लिए नहीं था, लेकिन मेटाडेटा भाग के भीतर एक ऐसी संपत्ति द्वारा फ़ाइल ढूंढें। यह संपत्ति मेटाडेटा और एमडी 5 के नीचे श्रेणीबद्ध रूप से है जो वास्तविक समस्या रही है। – sebastian

संबंधित मुद्दे