2013-06-20 4 views
2

J'utilise la fonction de carte ci-dessous pour obtenir des documents de l'utilisateur qui sont « liés » à partir d'un groupe:Filtrage CouchDB documents liés

function(doc) { 
    var i, id; 
    if(doc.type == 'group' && !doc.deletedAt) { 
    for (i = 0; i < doc.users.length; ++i) { 
     id = doc.users[i]; 
     emit(doc._id, {'_id': id}); 
    } 
    emit(doc._id, null); 
    } 
} 

Un groupe ressemble à:

{ 
    "_id": "3979684300c58a4c90c7c6e0d6033dce", 
    "_rev": "90-283daf6cb4edfd838a50121e3364f4cb", 
    "type": "group", 
    "name": "test", 
    "description": "test", 
    "users": [ 
     "544f4718732b51506d9de60a4e000505", 
     "63de6351a30879ee091b248c930a9254", 
     "5684612479ba328ba2575c60e800adee" 
    ], 
    ... other fields 
} 

Un utilisateur lookes comme:

{ 
    "_id": "8f87c698f119044890c5e788cd0028c1", 
    "_rev": "5-441da938e50fb692da55d74231f614c2", 
    "empId": "", 
    "type": "user", 
    "disabled": false, 
    "username": "fred", 
    "firstName": "Fred", 
    "lastName": "Jones", 
    ...other fields 
} 

La fonction carte fonctionne, mais je dois filtrer les documents d'utilisateurs qui ont un ensemble de propriété « deletedAt ». Est-ce possible dans la fonction de la carte?

Répondre

2

Vous ne pouvez pas faire cela sans modifier la structure de vos documents. Au lieu de stocker un tableau d'utilisateurs dans le document de groupe, vous devez stocker un tableau de groupes dans le document utilisateur. Alors la fonction de votre carte peut ressembler à ceci:

function(doc { 
    var i; 
    if(doc.type == 'user' && !doc.deletedAt) { 
    for (i = 0; i < doc.groups.length; ++i) { 
     emit(doc.groups[i], null); 
    } 
    } 
} 
+0

Changer la structure du document introduirait un tas de problèmes ailleurs dans l'application donc malheureusement ce n'est pas une option pour moi. – Troy

+0

Ensuite, malheureusement, cela ne fonctionnera pas. –

Questions connexes