представление Couchdb для выбора записей с ключом, содержащимся в массиве в документе

Пытаюсь разобраться с CouchDB... впервые использую базу данных, отличную от SQL.

Попытка выяснить, как написать представление, которое возвращает всех пользователей в определенной команде....

Пользовательские документы выглядят следующим образом:

{
   "_id": "e3031a9eb16dd879fbe78b61f800378b",
   "_rev": "3-8aaf2d203b92b684fbd7a27a7dff9108",
   "type": "user",
   "userid": "myuserid",
   "password": "mypassword",
   "email": "[email protected]",    
   "firstname": "joe",
   "lastname": "smith",
   "org": "companyname",
   "teams": [
       "team2",
       "otherTeam"
       ]
}

Там вы можете увидеть массив команд...

Я пробовал такие вещи, как:

function(doc) {
    if (doc.type == 'user') {
        if ((doc.teams.indexOf(searchString) > -1){
            emit(doc.user, doc)
        }
    }
}

Но это не так. Я знаю...

У меня были успехи с другими представлениями (например, поиск пользователя по идентификатору пользователя) и вызов их с помощью nano, например:

db.view('users', 'by_userid', {'key': userid, 'include_docs': true},     
  function(err, body) {
    .. etc
});

Но я совсем запутался, как это сделать...

db.view('users', 'by_team', {'key': teamName, 'include_docs': true},     
  function(err, body) {
    .. etc
});

Любая помощь очень ценится.


person Vida    schedule 17.12.2015    source источник


Ответы (2)


Функция карты CouchDb создает представление = простой словарь пар ключ-значение. Встроенная функция emit принимает 2 параметра, первый из которых будет ключом в представлении, а второй — значением. Итак, после вашей карты представление «by_team» должно выглядеть так:

team2 : {document where team2 is in the teams arr},
team2 : {other document where team2 is in the teams arr},
team2 : {and other document where team2 is in the teams arr},
otherTeam : {document where otherTeam is in the teams arr},
otherTeam : {etc}

И когда вы запрашиваете с помощью {'key': 'team2'} db.view, просто выберите значения с указанным ключом. Вы также можете использовать {keys : [array, of, keys]} для запроса нескольких ключей.

кстати вы можете выдать (doc.teams[curTeam], null) и запросить с помощью {'key': 'team2', 'include_docs': true} этот подход уменьшит размер вашего представления, если это необходимо .

person the4lt    schedule 18.12.2015
comment
Большое спасибо.. теперь все становится немного яснее. - person Vida; 18.12.2015
comment
Ok! Итак, копейка наконец упала ... Когда я запрашиваю представление ... Я не пытаюсь вставлять значения в определение представления (например, в хранимой процедуре SQL). Я запрашиваю ВЫВОД представления! Итак, «ключ» проверяется по первому столбцу вывода представления... Дох! Хорошо.. теперь я получаю это! Спасибо еще раз.. - person Vida; 18.12.2015

Просто к вашему сведению, нашел ответ через этот пост:

представление CouchDb — ключ в списке

Мой код выглядит так для представления:

function(doc) {
   if(doc.teams) {
      for (var curTeam in doc.teams) {
        emit (doc.teams[curTeam],doc);
      }
  }
}

А потом вызывали так:

db.view('users', 'by_team', {'key': 'team2'},function(err, body) {
  if (!err) {
    body.rows.forEach(function(doc) {
      console.log(doc);
    });
  }
});

Я до сих пор не совсем понимаю это... но это работает... хех... Если кто-нибудь может объяснить, как "team2" используется в представлении... Буду признателен...

person Vida    schedule 17.12.2015