2011-09-02 4 views
8

J'ai des documents enregistrés dans une collection (appelée urls) qui ressemblent à ceci:MongoDB - match de regex de clés pour les sous-documents

{ 
    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' 
     } 
    } 
} 

Utilisation du mongo CLI, est-il possible de rechercher des sous-documents de payload que correspondre à /^url_/? Et, si cela est possible, serait-il également possible d'interroger les sous-documents du match (par exemple, assurez-vous que text existe)?

Je pensais quelque chose comme ceci:

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

Mais c'est de retour 0.

Toute aide ou suggestion serait formidable.

Merci,

Matt

Répondre

5

Il est impossible d'interroger sur les clés de documents de cette façon. Vous pouvez rechercher des correspondances exactes à l'aide de $exists, mais vous ne pouvez pas trouver les noms de clé correspondant à un modèle.

Je suppose (peut-être incorrectement) que vous essayez de trouver des documents qui ont un sous-document d'URL, et que tous les documents ne l'auront pas? Pourquoi ne pas pousser cette information de type bas niveau, quelque chose comme:

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

Ensuite, vous pouvez interroger comme:

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

Je voudrais aussi négligents si je ne note que vous ne devriez pas utiliser des points (.) est un nom de clé dans MongoDB. Dans certains cas, il est possible de créer des documents comme celui-ci, mais cela provoquera de grandes confusions lorsque vous tenterez d'interroger des documents incorporés (où Mongo utilise le point comme un «séparateur de chemin» pour ainsi dire).

+0

Merci pour votre réponse. Malheureusement, je n'ai aucun contrôle sur la conception des documents qui sont insérés dans la collection:/ En outre, je ne suis pas sûr de ce que vous voulez dire quand vous dites un document incorporé? avez vous un lien? Est-ce la même chose qu'un sous-objet? –

+1

Je pense que cela signifie la même chose que ce que vous appelez un "sous-objet". "Document incorporé" est un terme plus centré sur les données, alors que "sous-objet" est un terme plus centré sur la programmation (pour les langues où les documents Mongo sont exprimés en tant que hiérarchie d'objets). Si vous ne pouvez pas changer la structure des documents de votre collection, vous pouvez envisager d'utiliser map-reduce pour les réécrire dans un format plus interrogeable (comme celui que j'ai proposé ici) – dcrosta

+0

Cool, merci pour l'aide! –