2011-04-08 5 views
2

considérer la structure du document suivant ...paramètres dynamiques Émulation avec vue

{ 
    _id, 
    _rev, 
    postTitle, 
    postBody 
} 

J'écris un petit NodeJS d'application blog, où je voudrais mes URL pour refléter un titre de messages. Par exemple /WebLog/Posts/View/Hello-World/.

Puisqu'il n'est pas possible d'interroger CouchDB sur autre chose que la propriété _id, est-il sensé que je crée une vue pour chaque publication, afin de mapper un postTitle sur un postTitle?

Comment voulez-vous interroger d'autres propriétés de document que le _id?

... Devrais-je simplement renoncer à utiliser MongoDB ou MySQL? Est-ce que je demande trop de CouchDB?

Répondre

1

Les vues sont comment créer des index dans CouchDB. Pour obtenir des documents par postTitle, utilisez une vue dont les clés sont postTitle s et interrogez-la avec key=<title> et includedocs=true.

{ 
    "views": { 
     "by-post-title": { 
      "map": "function(doc) { emit(doc.postTitle, null); }" 
     } 
    } 
} 

Et la requête: GET /<db>/_design/<design>/_view/by-post-title?includedocs=true&key="Hello-World"

En savoir plus sur sur le CouchDB Wiki.

+0

Cette réponse ne concerne pas le format des URL résultantes mentionnées dans la question. Ajouter du contenu lié à la réécriture d'URL, et je vais voter. :) –

+0

@ matt-passell: vous avez raison de ne pas aborder les URL mentionnées dans la question, mais ce n'était qu'un exemple. Ma compréhension était que ces URL allaient être servis par l'application node.js, qui interrogerait l'instance de CouchDB à son tour. – Amir

0

S'il vous plaît ne pas faire une vue pour chaque poste, cela semble douloureux à maintenir. Cependant, vous pouvez utiliser soit Django (avec Couchdb) ou Couchapp, et les deux ont de bonnes capacités de réécriture d'url. Aussi, regardez ce sur le site couchone:

couchdb rewrites in 0.11

1

Vous avez partiellement répondu à votre propre question, mais oui vous allez créer une vue, comme mentionné précédemment par un répondant.

"views": { 
    "by-post-title": { 
     "map": "function(doc) { 
      if(doc.postTitle){ 
       var titleURL = postTitle.split(" ").join("_"); 
       emit(doc.titleURL, {"body" : doc.postBody, "title": doc.postTitle); 
      } 

     }" 
    } 
} 

maintenant, http://yourcouchdb:yourport/yourdb/_design/by-post-title/_view/by-post-title?key= "hello_world" retournerait votre postBody et postTitle.

Étant donné que vos documents peuvent contenir d'autres valeurs de clé:, il est préférable de ne pas renvoyer le document entier comme second paramètre dans les appels d'émission.

Questions connexes