1

我正在 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”的诱惑,但请稍等:在现实世界的应用程序中,根据文档而不是表/行等来考虑 NoSQL,您可能想要完整的文档为用户。想象一下,您有一个简单的系统来检索客户详细信息。您需要完整的文档。仅当您首先提供密钥电子邮件时才需要知道 ID 和密钥。

4

3 回答 3

3

自从我使用 couchdb 以来已经有一段时间了,但我相信这仍然是准确的。

您只能检索这两个字段,因为这就是您放入视图的全部内容。couchdb 在内部跟踪与每个发出的键/值对应的文档的 id。然后,您可以在查询该视图时使用该include_docs选项让 couchdb 按 id 查找文档(请参阅文档

您概述的另一个选择是查看完整文档,这将使索引更大

于 2012-04-29T19:49:06.543 回答
2

您不需要发出文档。只需添加include_docs=true到您的查询参数。完整的文档在 wiki 1上。

于 2012-04-30T06:26:16.800 回答
1

您也可以使用 emit(doc.email, {name: doc.name, age: doc.age}) 发出部分文档

于 2012-04-30T07:45:12.067 回答