我正在Apache CouchDB上构建一个非常简单的用户系统。我已经构建了一个通过电子邮件搜索用户的简单视图:
by_email
map
function(doc) {
if (doc.kind == "user" && doc.email) emit(doc.email, doc.name);
}
返回
{"id"=>"00006a80-723b-012f-6b38-1040f398478e", "key"=>"spiderman@spiderman.ai", "value"=>"Spiderman"}
现在我可能会遗漏一些非常愚蠢的事情(如果是这种情况我会道歉)但是为什么你只能从这个视图中检索2个字段(如果我们计算ID则为3)?
在正常情况下,您可能希望从电子邮件或用户ID开始搜索用户数据库并检索完整文档。
现在我在http://guide.couchdb.org/draft/cookbook.html阅读了示例(按键查找) 并且,除非我遗漏了一些非常微不足道的东西,否则结果也是不完整的,因为它只返回具有特定年龄的用户的名称而已。
我无法理解这将如何正确使用:如果您查询客户端,供应商的数据库,无论您想要什么样的全部文档,而不仅仅是1个值或2。
所以我的解决方案是另一种观点:
mailplus
map
function(doc) { if (doc.kind == "user" && doc.email) emit(doc.email,doc) }
所以要将电子邮件和完整文档作为值返回给我。这可行,但你可以想象它在一个更大的数据库中相当慢。
所以问题是:有没有更好的方法来做一个简单的查询来检索用户通过电子邮件搜索的完整细节,例如使用CouchDB - NoSQL?
我知道回答“这是错误的诱惑,因为你无法想到NoSQL中的SQL”而是等待:在一个真实世界的应用程序中,根据Document而不是表/行等来考虑NoSQL,你可能想要用户的完整文档。想象一下,您有一个简单的系统来检索客户端详细信息。你需要完整的文件。只有在您首先提供密钥,电子邮件时,您才需要知道ID和密钥。
答案 0 :(得分:3)
因为我使用过couchdb已经有一段时间,但我相信这仍然是准确的。
您只能检索这两个字段,因为这是您放入视图的全部内容。内部couchdb跟踪与每个发出的键/值对应的文档的id。然后,您可以在查询该视图时使用include_docs
选项让couchdb按ID查找文档(请参阅docs)
您概述的另一个选择是在视图中显示完整的文档,这将使索引更大
答案 1 :(得分:2)
您无需发出文档。只需将include_docs=true
添加到查询参数中即可。完整的文档位于维基1。
答案 2 :(得分:1)
此外,您可以使用emit(doc.email,{name:doc.name,age:doc.age})发出部分文档。