2011-07-27 9 views
7

La solución probablemente me está mirando a la cara, pero no he tenido suerte en encontrarla. Mi problema es que necesito encontrar todos los documentos que contienen DBRef especificado. Aquí está la estructura de la colección que se debe buscar:Encontrar documentos por una matriz de DBRefs

{ 
    "_id" : ObjectId("4e2d4892580fd602eb000003"), 
    "date_added" : ISODate("2011-07-25T11:42:26.395Z"), 
    "date_updated" : ISODate("2011-07-25T11:43:09.870Z"), 
    ... 
    "a_list_of_dbrefs" : [ 
     { 
      "$ref" : "somecollection" 
      "$id" : "4e2d48ab580fd602eb000004" 
     } 
    ], 
    ... 
    "name" : "some name" 
} 

tengo que ser capaz de recuperar un conjunto de documentos sobre la base de un DBRef que aparecen en a_list_of_dbrefs (algunos a_list_of_dbrefs podrán indicarse DBRefs, otros pueden contener 1, y otros puede contener más de 1).

¿Cómo se logra esto?

Respuesta

2

Recomendaría dejar el DBRef s a favor de simplemente almacenar el _id del documento referenciado suponiendo que conoce el nombre de la colección a la que se hace referencia.

No hay forma de "resolver" una matriz de DBRef desde el servidor (en un solo paso) en MongoDB y requiere que recorra la matriz en el cliente y resuelva individualmente cada documento.

Por el contrario, si almacena una matriz de la referenciada _id puede recuperar esa matriz y luego utilizar la consulta $in para buscarlas todas.

Así que el documento podría cambiar para parecerse a esto:

{ 
    "_id" : ObjectId("4e2d4892580fd602eb000003"), 
    "date_added" : ISODate("2011-07-25T11:42:26.395Z"), 
    "date_updated" : ISODate("2011-07-25T11:43:09.870Z"), 
    ... 
    "references": [ 
     ObjectId(123), ObjectId(234), ObjectId(567), ObjectId(891) 
    ], 
    ... 
    "name" : "some name" 
} 

continuación puede consultar MongoDB utilizando los contenidos del campo references:

db.somecollection.find({"_id": {"$in": references}}) 
+0

La razón por la que no me gusta esto es porque el uso de DBRef significa que los documentos se pueden serializar automáticamente en sus contrapartes de Java usando MongoTemplate, por ejemplo. De lo contrario, la serialización debe personalizarse – IcedDante

15

Prueba con esto, que trabajó para mí:

db.<your collection>.find({"a_list_of_dbrefs.$id": ObjectID("4e2d48ab580fd602eb000004")}) 

También puede recuperar todos los elementos que tienen la referencia a la colección:

db.<your collection>.find({"a_list_of_dbrefs.$ref": "somecollection"}) 
+0

Creo que esto debería marcarse como la respuesta correcta ... – martin

Cuestiones relacionadas