2

试图让我的头脑围绕 couchdb... 第一次使用不是 SQL 的数据库。

试图弄清楚如何编写一个返回特定团队中所有用户的视图......

用户文档是这样的:

{
   "_id": "e3031a9eb16dd879fbe78b61f800378b",
   "_rev": "3-8aaf2d203b92b684fbd7a27a7dff9108",
   "type": "user",
   "userid": "myuserid",
   "password": "mypassword",
   "email": "myemail@myjob.com",    
   "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)
        }
    }
}

但那不是它。我知道...

我在其他视图上取得了成功(例如通过用户 ID 查找用户)并使用 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
});

非常感谢任何帮助。

4

2 回答 2

3

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} 进行查询,如果需要,这种方法将减小视图的大小。

于 2015-12-18T10:32:16.163 回答
0

仅供参考,通过这篇文章找到了答案:

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”是如何在视图中使用的......我会很感激......

于 2015-12-17T17:35:28.623 回答