2012-04-29 44 views
1

我在Apache CouchDB上构建了一个非常简单的用户系统。我建立一个简单的视图通过电子邮件进行搜索的用户:CouchDB简单选择正确的方式?

by_email 
map 
function(doc) { 
if (doc.kind == "user" && doc.email) emit(doc.email, doc.name); 
} 

这将返回

{"id"=>"00006a80-723b-012f-6b38-1040f398478e", "key"=>"[email protected]", "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”,而是等待:在真实世界的应用程序中,按照Documents和No/Table /希望为用户提供完整的文档。想象一下,你有一个简单的系统来检索客户端的细节。你需要完整的文档。只有当你提供密钥,电子邮件时,你才需要知道ID和密钥。

回答

3

已经有一段时间我使用CouchDB的,但我相信这仍然是准确的。

只能检索那些2场,因为这是你投入的视图。内部couchdb跟踪与每个发出的键/值对应的文档的ID。然后,您可以查询该视图时有CouchDB的通过ID查找文件使用include_docs选项(参见docs

其他的选择,因为你概括是有鉴于完整的文档,这将使得指数更大

+0

所以一个可能的解决方案是使用例如电子邮件作为id(或用户名)?这将强制唯一用户(尽管复制有限),这是另一个问题。老实说,我想我错过了一些东西:没有验证一个记录(validates_uniqueness_of:email,:用户名),这是一个相当基本的东西,并且在Web开发中有所期待?因为它为用户提供完整的配置文件。G。当用户想要修改他的详细信息等。 – devnull

+0

对于这种唯一性验证,您可以为每个文档发送两次,首先以电子邮件为关键字,然后以名称命名,之后检查两个键的出现结果视图(请参阅couchdb维基) 。但它不能解决问题,因为有人可以在检查后插入记录,而且在复制的情况下可以在不同的服务器上插入冲突的密钥,如何解决冲突?正确的解决方案应该使用像mysql这样的数据库约束,afair rails不会在他们的activerecord中使用它们。 couchdb具有服务器端验证器,但不能进行子查询 – avsej

2

您不需要发布文档。只需将include_docs=true添加到您的查询参数。完整文档位于wiki 1

1

您也可以发出文档的一部分与EMIT(doc.email,{名称:doc.name,年龄:doc.age})