如何为以下情况设计couchdb视图?

如何为以下情况设计couchdb视图?,couchdb,mapreduce,Couchdb,Mapreduce,我正在将一个应用程序从mySQL迁移到couchDB。(好的,请不要对这件事做出评判) 有一个带有签名的函数 getUserBy($column, $value) 现在您可以看到,对于SQL,构造一个查询并启动它是一项简单的工作 然而,就couchDB而言,我应该用map函数编写视图 目前我有很多观点,比如 get_user_by_name get_user_by_email 等等。有人能提出一种更好的、可扩展的方法吗 当然!我最喜欢的一个视图,因为它的强大,是by\u field。这是

我正在将一个应用程序从mySQL迁移到couchDB。(好的,请不要对这件事做出评判)

有一个带有签名的函数

getUserBy($column, $value) 
现在您可以看到,对于SQL,构造一个查询并启动它是一项简单的工作

然而,就couchDB而言,我应该用map函数编写视图

目前我有很多观点,比如

get_user_by_name
get_user_by_email 

等等。有人能提出一种更好的、可扩展的方法吗

当然!我最喜欢的一个视图,因为它的强大,是
by\u field
。这是一个非常简单的映射函数

function(doc) {
    // by_field: map function
    // A single view for every field in every document!
    var field, key;

    for (field in doc) {
        key = [field, doc[field]];
        emit(key, 1);
    }
}
假设您的文档的名称有一个
.name
字段,电子邮件地址有一个
.email

要按名称获取用户(例如“Alice”和“Bob”):

要通过电子邮件获取用户,请从同一视图:

GET /db/_design/example/_view/by_field?include_docs=true&key=["email","alice@gmail.com"]
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","bob@gmail.com"]

我喜欢发出
1
的原因是,您可以在以后编写reduce函数,使用
sum()
轻松地添加与查询匹配的文档。

这就是我解决此问题的方法,但我关心的是可伸缩性。对于每个字段有m个的n个文档,它将输出大约n*m行。我不熟悉CouchDB的内部结构,但作为mysql的一员,我想知道这是否会占用很长时间。最初调用视图时可能需要一些时间,但视图结果会被缓存,因此再次查询视图时只考虑更新的文档。此外,如果不需要每个字段输出,可以修改上面的“by_field”MapReduce只输出您感兴趣(或计划感兴趣)的字段。在您的n*m等式中,m是您关心的字段数。也就是说,让它“完全开放”会给您带来更大的灵活性,但代价是视图索引使用更多的磁盘空间(尽管相对最小)(gre提到的结果缓存)。
GET /db/_design/example/_view/by_field?include_docs=true&key=["email","alice@gmail.com"]
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","bob@gmail.com"]