2012-04-23 15 views
9

Co próbuję zrobić, to pobrać listę plików GridFS, wysyłając zapytanie do pola z metadanymi. Na przykład mam dokument plików GridFS patrząc jak:Zapytanie dotyczące metadanych GridFS w MongoDB (Java)

{ "_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"}} 

I chcę zapytać wszystkie pliki zawierające „target_field” = „ABCDEFG”. Tworzę zapytanie następująco:

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

Lista jest zawsze dobrze pusta. W przeciwnym razie zapytanie o nazwę pliku lub uploadDate działa idealnie. Czy nie można uzyskać plików GridFS według zagnieżdżonych atrybutów?

+0

Czyżby pan błędnie coś? Działa to dobrze na moim komputerze. Używam mongod 2.0.4 i v2.7.3 dla sterownika Java. – Ren

Odpowiedz

15

Niestety nie udało mi się uruchomić go z zagnieżdżonymi obiektami BasicDBO.

Wreszcie używałem notacji dot które działa prawidłowo:

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

Dzięki za odpowiedź na własne pytanie. Miałem podobne kłopoty, a twoja odpowiedź pomogła mi je rozwiązać. –

0

z dokumentacji MongoDB (http://docs.mongodb.org/manual/tutorial/query-documents/#exact-match-on-the-embedded-document):

Odpowiadający dokładnie na wbudowanym Dokumentu

Aby określić dopasowanie równości na cały dokument wbudowany, użyj dokumentu zapytania {:}, gdzie dokument jest zgodny. Dopasowania równości w dokumencie osadzonym wymagają dokładnego dopasowania podanej, w tym kolejności w terenie.

Równość Mecz na polach wewnątrz wbudowanego Dokumentu

pomocą notacji kropki dopasować przez konkretnych dziedzinach w osadzonym dokumentu. Dopasowania równości dla określonych pól w dokumencie osadzonym będą wybierać dokumenty w kolekcji, w których osadzony dokument zawiera określone pola o określonych wartościach. Osadzony dokument może zawierać dodatkowe pola.


Napisałem prosty kod do przetłumaczyć „zapis” dokument „w notacji”. Mam nadzieję, że jest to przydatne.

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; 
} 

Dla celów:

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

Zachowaj ostrożność podczas korzystania z tego kodu. Spłaszcza całe zapytanie, w tym operatory typu '$ in' lub' $ nin'. Wierzę, że dla zdrowego rozsądku zespołu programistycznego należy tego unikać, a zapytania pisane od początku w notacji kropkowej. – madmuffin

0

Prostsze:

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

Być może mógłbyś wyjaśnić, w jaki sposób ten kod jest lepszy lub prostszy, jak mówisz, zamiast robić, że czytelnicy próbują znaleźć przyczynę? –

+0

Problem polegał na tym, że nie można pobrać pliku za pomocą jego kodu md5, ale znaleźć plik według właściwości, która znajduje się w części metadanych. Ta właściwość jest hierarchicznie poniżej metatdata i md5, co było rzeczywistym problemem. – sebastian

Powiązane problemy