2013-03-28 80 views
1

我一直在阅读关于CouchDB的更多信息,并且非常喜欢它(master:master replication是我想要使用它的主要原因之一)。CouchDB - 如何基于最终用户输入创建动态设计文档

但是,我有一个查询问你们...我从PHP的凸轮,并经常使用Drupal CMS。我最喜欢的一个(可能是整个drupal社区)是MerlinOfChaos编写的'Views'插件。这个想法是,管理员可以使用视图ui系统,从数据库中创建一个动态的内容流。该内容可以来自任何内容类型(博客文章,文章,用户,图像等),并且可以被过滤,排序,以网格排列,等等。一个简单的例子是为动画滑块创建内容来源。管理员可以随时进入并更改其中显示的内容。虽然通常我会将其设置为内容类型X的最近5个。

因此,对于像mongo这样的东西,我可以看看如何做到这一点。一个相当先进的解析器,然后将管理员想要的内容转换为数据库查询。由于mongo都基于动态查询,因此非常可行。不过,我想用沙发。

我已经看到,我可以创建一个视图,它需要一个参数,并将返回基于该参数的结果(例如,您要显示的5个文章ID的参数)。但是如果我想能够从UI中构建更高级的东西呢?我会添加更多的参数吗?例如,假设创建的视图选择值为'contentType'='post'且参数为id /页面标题的所有文档。但是如果我希望最终用户也能够选择视图查询的内容类型。或者最近的5篇文章,只要内容类型是3个不同的值之一?

这使我想到的另一件事是,一旦像这样的视图被创建并保存到数据库中,并且第一次调用它,它就花费时间来创建结果。你会在生产/现场系统上做到这一点吗?

部分原因是我希望最终用户能够根据网站上的文章和帖子在其个人资料页面上创建内容的自定义提要。并能够过滤它们并制作他们自己的类别,这样可以说出来并给它们加上标签。如他们的'技术'饲料,和他们的'食物'饲料。

我还是新来的沙发,还有阅读要做。但是,这是一个buggins我,我正在试图包裹我的头。由于我想到的产品将根据最终用户的输入而动态变化。

应用程序本身将用Python编写的

+0

我会非常关心一个系统的性能,该系统可能有数百或数千个设计文档/视图,每个系统最终都会针对数据库的每次更新运行。 – WiredPrairie 2013-03-28 11:06:25

+0

是的,这是重点,我不想要所有这些。所以我想弄清楚如何有效地做到这一点。 – skift 2013-03-28 17:32:13

回答

1

简而言之,你将需要发出像这样的观点:

emit([doc.contentType, doc.addDate], doc); // emit the entire doc, 
// add date is timestamp (assuming) 

emit([doc.contentType, doc.addDate], null); // use with include_docs=true 

然后,当你需要取得上市:

startkey=["post",0]&endkey=["post",999999999]&limit=5&descending=true 

解释:

startkey = ["post",0] = contentType is post, and addDate >= 0 
endkey  = ["post",9999999999] = contentType is post, and addDate <= 9999999999 
limit  = 5, limit to five posts 
descending = true = sort descending, which is sort by adddDate descending 

为了克服更新直播分贝的意见,
你也可以创建一个新的设计(图)文档的缺点。
因此,至少您现有的代码和视图不会受到影响。

只有在创建新视图之后,您才会部署最新的代码以切换到此新视图
并且您可以撤销旧视图。

+0

我想我明白你在做什么。如果用户现在决定他们只需要来自特定用户的帖子,该怎么办?或者如果不仅仅是帖子,他们希望看到帖子以及新图片?为了添加作者,我猜我只是将它添加到上面并将其默认为None,如果是None,则不要使用它/显示全部。我将如何基于可变数量的内容类型进行doc.contentType查询? – skift 2013-03-28 17:38:01

+0

您必须在制作视图之前确定业务逻辑。如果想从某些用户发布帖子 - 没有真正快捷的方法。但是,您可以将另一个键(用户)添加到发射中。对于多个contentType ...你必须先确定。就像你说的,'if(doc.ContentType =='posts'|| doc.contentType =='images'){emit(doc.addDate,doc); }' – ajreal 2013-03-28 17:45:18

+0

我可以这样做吗? (内容类型在doc.ContentType中){emit(doc.addDate,doc);} if(contentType in doc.ContentType){emit(doc.addDate,doc);} if(contentType in doc.ContentType){emit(doc.addDate,doc); }' – skift 2013-03-29 02:44:00