Documentos anidados e índices _id en mongodb

Tengo una colección con documentos anidados en ella. Cada documento también tiene un campo _id.

Aquí hay un ejemplo de una estructura de documentos.

{
   "_id": ObjectId("top_level_doc"),
   "title": "Cadernos",
   "parent": "4fd55bbc5d1709793b000008",
   "criterias": {
     "0": {
       "_id": ObjectId("a_nested_doc"),
       "value": "caderno",
       "operator": "contains",
       "field": "design0" 
    } 
  } 
}

Quiero poder encontrar el documento anidado simplemente buscando su _id

Con esta consulta

{
    "criterias._id" : ObjectId("a_nested_doc")
}

Devuelve el documento principal (solo quiero el que está anidado).

Idealmente haría esto

{
    "_id" : ObjectId("a_nested_doc")
}

Y devolvería el documento con esa identificación (ya sea que esté anidado o no).

PD. Edité los valores "_id" en aras de la simplicidad solo para este ejemplo.

preguntado el 12 de junio de 12 a las 18:06

1 Respuestas

Es posible que tenga que vivir con la selección de criterias._id (sin escribir un contenedor alrededor de la consulta, al menos), pero puede seleccionar el documento en sí simplemente recuperando un subconjunto de los campos.

http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

// The simplest case converted to your use case
db.collection.find( { criterias._id : ObjectId("a_nested_doc") }, { criterias : 1 } );

Respondido el 12 de junio de 12 a las 19:06

Esperaba que no llegara a eso ya que estos documentos se generan dinámicamente y no siempre tienen la misma estructura (por ejemplo, el campo "criterios" podría tener un nombre completamente diferente). - Igor Azevedo

¿Puede aclarar en su pregunta cómo dos documentos pueden diferir (con un ejemplo si es posible) con respecto a esto? - estofado

Bueno, el nombre del campo con los documentos anidados no siempre será "criterio", pero siempre usaré el mismo código para consultar la base de datos. - Igor Azevedo

De todos modos, no veo ninguna alternativa mejor que usar el método que describiste, así que haré cambios en mi código para que funcione de esta manera. Gracias - Igor Azevedo

Deseché mi intento de comentario, de nada y buena suerte. - estofado

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.