如何为以下情况设计couchdb视图?
我正在将一个应用程序从mySQL迁移到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。这是
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"]