2013-06-20 4 views
2

Я использую следующую функцию карты, чтобы получить документы пользователей, которые «связаны» с из группы:Фильтрация CouchDB связанных документов

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); 
    } 
} 

группа выглядит как:

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

Пользователь, lookes как:

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

функция карта работает, но мне нужно, чтобы отфильтровать документы пользователей, которые имеют набор свойств «deletedAt». Возможно ли это в функции карты?

ответ

2

Вы не можете сделать это, не меняя структуру своих документов. Вместо хранения массива пользователей в документе группы вы должны сохранить массив групп в пользовательском документе. Тогда ваша функция карты может выглядеть так:

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

Изменение структуры документа приведет к появлению множества проблем в другом месте приложения, поэтому, к сожалению, это не вариант для меня. – Troy

+0

Тогда, к сожалению, это не сработает. –

Смежные вопросы