2011-07-06 8 views
1

j'ai 2 types de documents, documents utilisateur où le accountdata est stocké et des documents où des informations supplémentaires sur la société de l'utilisateur est stockévues CouchDB/réduire

par exemple:

userdocs:

{ id : ABC 
, name : "user1" 
, active : false 
, type : "user" 
} 

{ id : XYZ 
, name : "user2" 
, active : true 
, type : "user" 
} 

entreprises:

{ id : ... 
    , name : "company1" 
    , owner : "ABC" 
    , type : "company" 
    } 

{ id : ... 
, name : "company2" 
, owner : "XYZ" 
, type : "company" 
} 

liens propriétaire aux documents ID e L'utilisateur qui a créé le document après l'enregistrement, maintenant je voudrais afficher seulement les entreprises où le propriétaire du document est mis à

quelle est la meilleure façon de le faire? puis-je utiliser réduire les fonctions? des exemples seraient appréciés

Répondre

1

Vous pouvez essayer de le faire en ayant une base de données dénormalisée pour stocker différents types de documents (ayant un attribut type dans chaque document pour différencier un document d'un autre) et utiliser view collation.

0

Comme vous pouvez le voir, j'ai un attribut de type dans chaque document. Quoi qu'il en soit, j'ai résolu cela en utilisant une fonction de listes. Peut-être que ce n'est pas la meilleure façon de le faire, mais jusqu'à présent, il fonctionne très bien pour mon cas. Je vais certainement jeter un coup d'oeil dans la collation de vue mais c'est un peu confus.

+2

pouvez-vous fournir des détails sur la solution que vous utilisez? Je serais très intéressé. –

0

-je utiliser ce http://wiki.apache.org/couchdb/Formatting_with_Show_and_List pour transformer mon résultat de la vue et construire une JSON qui ressemble à la sortie standard d'une vue, le code ressemble à ceci:

à mon avis je n'émettons que les utilisateurs qui sont actifs

while(row = getRow()) { 
    if(row.value.type=="user") 
     active.push(row.value.id) 
    if(row.value.type=="companies") 
     companies.push(row) 
} 
for(var i = 0; i < companies.length; i++){ 
    if(active.indexOf(companies[i].value.owner) != -1) 
    res.push(companies[i]) 
} 
send('{\"total_rows\":'+companies.length+',\"rows\":[') 
for(var i = 0; i < res.length;i++) { 
    send(toJSON(res[i])) 
    if(i+1 < res.length) 
    send(',') 
    } 
send(']}') 

comme je l'ai dit des thats peut-être pas comment cela devrait être fait :) mais peut-être que quelqu'un peut me donner un exemple comment cela pourrait fonctionner avec vue sur la collation