couchdb views / reduce

时间:2011-07-06 16:53:56

标签: join couchdb

我有2种文件,存储帐户数据的用户文件和存储有关用户公司的其他信息的文件

例如:

用户文档:

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

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

公司:

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

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

所有者链接到注册后创建文档的用户的文档ID,现在我只想查看文档所有者设置为活动的公司

最好的办法是什么?我可以使用reduce功能吗?任何例子将不胜感激

3 个答案:

答案 0 :(得分:1)

您可以尝试通过使用非规范化数据库来存储不同类型的文档(在每个文档中具有类型属性以将一个文档与另一个文档区分开来)并使用view collation来实现此目的。

答案 1 :(得分:0)

正如您所看到的,我在每个文档中都有一个type属性。无论如何,我通过使用列表函数解决了这个问题。也许它不是最好的方法,但到目前为止它的工作对我的用例来说还不错。我肯定会看一下整理视图,但它有点令人困惑。

答案 2 :(得分:0)

我使用这个http://wiki.apache.org/couchdb/Formatting_with_Show_and_List来转换视图的结果并构建一个看起来像视图标准输出的json,代码看起来像这样:

在我看来,我只会发出活跃的用户

 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(']}')

正如我所说的那样或许不应该怎么做:)但也许有人可以给我一个例子,如何使用视图整理