2011-09-02 13 views
8

He algunos documentos guardados en una colección (llamada urls) que se ven así:MongoDB - Partido de expresiones regulares de claves para subdocumentos

{ 
    payload:{ 
     url_google.com:{ 
      url:'google.com', 
      text:'search' 
     } 
    } 
}, 
{ 
    payload:{ 
     url_t.co:{ 
      url:'t.co', 
      text:'url shortener' 
     } 
    } 
}, 
{ 
    payload:{ 
     url_facebook.com:{ 
      url:'facebook.com', 
      text:'social network' 
     } 
    } 
} 

Utilizando el mongo CLI, es posible buscar subdocumentos de payload que partido /^url_/? Y, si eso es posible, ¿también sería posible consultar en los subdocumentos del partido (por ejemplo, asegúrese de que exista text)?

que estaba pensando algo como esto:

db.urls.find({"payload":{"$regex":/^url_/}}).count(); 

pero eso es devolver 0 resultados.

Cualquier ayuda o sugerencia sería genial.

Gracias,

Matt

Respuesta

5

No es posible consultar en contra teclas documento de esta manera. Puede buscar coincidencias exactas usando $exists, pero no puede encontrar nombres de tecla que coincidan con un patrón.

Supongo (quizás incorrectamente) que está tratando de encontrar documentos que tienen un sub documento de URL, y que no todos los documentos tendrán esto. ¿Por qué no empujar ese tipo de información a un nivel inferior, algo así como:

{ 
    payload: { 
    type: "url", 
    url: "Facebook.com", 
    ... 
    } 
} 

Posteriormente, se podría consultar como:

db.foo.find({"payload.type": "url", ...}) 

También sería negligente si no tuviera en cuenta que no debe utilizar puntos (.) son nombres clave en MongoDB. En algunos casos, es posible crear documentos como este, pero causará grandes confusiones cuando intente realizar consultas en documentos incrustados (donde Mongo usa el punto como un "separador de ruta", por así decirlo).

+0

Gracias por su respuesta. Lamentablemente, no tengo control sobre el diseño de los documentos que se insertan en la colección:/ Además, no estoy seguro de lo que quiere decir cuando dice documento incrustado? ¿Tienes un enlace? ¿Es eso lo mismo que un subobjeto? –

+1

Creo que significa lo mismo que lo que llamas un "subobjeto". El "documento incrustado" es un término más centrado en los datos, mientras que "subobjeto" es un término más centrado en la programación (para los idiomas en los que los documentos Mongo se expresan como una jerarquía de objetos). Si no puede cambiar la estructura de los documentos en su colección, podría considerar usar map-reduce para reescribirlos en un formato más consultable (como el que propuse aquí) – dcrosta

+0

Cool, gracias por la ayuda! –

Cuestiones relacionadas