2012-04-23 21 views
9

Lo que trato de hacer es buscar una lista de archivos GridFS consultando un campo de los metadatos. Por ejemplo Tengo un documento de archivo GridFS mirando como:Consulta en MongoDB Metadatos GridFS (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"}} 

Y quiero consultar todos los archivos que contienen "target_field" = "ABCDEFG". Creé mi consulta de la siguiente manera:

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

La lista está siempre vacía. De lo contrario, consultar el nombre de archivo o uploadDate funciona a la perfección. ¿No es posible obtener los archivos GridFS por atributos anidados?

+0

Podría ser posible que mal escrito algo? Esto funciona bien en mi máquina. Estoy usando mongod 2.0.4 y v2.7.3 para el controlador de Java. – Ren

Respuesta

15

Desafortunadamente no conseguí que funcione con BasicDBObjects anidados.

Finalmente yo estaba usando la notación de puntos que funciona muy bien:

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

Gracias por responder a su propia pregunta. Tuve una situación similar y tu respuesta me ayudó a resolverlos. –

0

De la documentación MongoDB (http://docs.mongodb.org/manual/tutorial/query-documents/#exact-match-on-the-embedded-document):

correspondencia exacta en el documento incrustado

Para especificar un partido de la igualdad en el todo el documento incrustado, use el documento de consulta {:} donde se encuentra el documento para que coincida. Las coincidencias de igualdad en un documento incrustado requieren una coincidencia exacta de la especificada, incluido el orden de campo.

Igualdad de ajuste de campos dentro de un documento incrustado

Use la notación de punto de igualar por campos específicos en un documento incrustado. Las coincidencias de igualdad para campos específicos en un documento incrustado seleccionarán documentos en la colección donde el documento incrustado contiene los campos especificados con los valores especificados. El documento incrustado puede contener campos adicionales.


me escribió un código simple de traducir el "documento de notación" en "notación". Espero que sea útil.

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

para su propósito:

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

Tenga cuidado al usar este código. Aplana toda la consulta, incluidos operadores como '$ in' o' $ nin'. Creo que para la sensatez del equipo de desarrollo, esto debe evitarse y las consultas escritas en notación de puntos desde el principio. – madmuffin

0

más simple:

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

¿Quizás podría explicar cómo este código es mejor o más simple, como usted dice, en lugar de hacer que los lectores intenten descubrir por qué? –

+0

El problema no era obtener un archivo por su código md5 sino encontrar el archivo por una propiedad que está dentro de la parte de metadatos. Esta propiedad está jerárquicamente debajo de los metadatos y md5, que ha sido el problema real. – sebastian

Cuestiones relacionadas