2011-03-17 3 views
2

J'essaie de stocker la disposition du réseau dans la base de données Couch, mais ma solution fournit un graphique plutôt aléatoire. je stocke un noeuds avec un document:Enregistrer une structure de type graphique dans Couch DB ou include_docs vous-même

{_id , 
nodeName, 
group} 

et le stockage des liens dans traditionnels:

{_id, source_id, target_id, value} 

Après plusieurs tutoriels sur la manipulation des jointures et des relations multiples dans Couch DB I créés Vue:

function(doc) { 
    if(doc.type == 'connection') { 

     if (doc.source_id) 
     emit("source", {'_id': doc.source_id}); 
     if(doc.target_id) 
     emit("target", {'_id': doc.target_id}); 
    } 

} 

qui aurait dû avoir une séquence d'identifiants source et cible, puis je la passe à la fonction de liste avec include_docs=true, suppose que source et t Arget viennent par paires coud tout retour dans une structure comme celle-ci:

{ 
    "nodes":[ 
    {"nodeName":"Name 1","group":"1"}, 
    {"nodeName":"Name 2","group":"1"}, 
    ], 
    "links": [ 
    {"source":7,"target":0,"value":1}, 
    {"source":7,"target":5,"value":1} 
    ] 
} 

Bien que ma liste produire un bon JSON, voir la carte retourne le nombre de lignes de la source docs et cible docs. Jusqu'à présent, je n'ai aucune idée de comment faire fonctionner cette chose correctement - je suis heureux d'aller chercher des valeurs supplémentaires du document _id dans la liste, mais jusqu'à présent, je n'ai pas trouvé de bons exemples. D'autres façons d'atteindre le même objectif sont les bienvenues. _id les valeurs sont standard pour CouchDB jusqu'ici. Mise à jour: tout en écrivant une question, j'ai trouvé une vue différente qui a résolu mon problème immédiat, mais je voudrais toujours voir d'autres options. carte mise à jour:

function(doc) { 
    if(doc.type == 'connection') { 

     if (doc.source_id) 
     emit([doc._id,0,"source"], {'_id': doc.source_id}); 
     if(doc.target_id) 
     emit([doc._id,1,"target"], {'_id': doc.target_id}); 
    } 

} 

Répondre

1

Votre fonction carte mise à jour est plus logique. Cependant, vous n'avez pas besoin de 0 et 1 dans votre clé puisque vous avez déjà "source" et "target".

Questions connexes