我正试图绕过CouchDB
。我正试图关闭MongoDB
到CouchDB
因为我认为views
的概念对我更有吸引力。在CouchDB
中,所有记录都存储在单个数据库中。没有集合概念或任何东西,例如MongoDB
。因此,在存储不同的数据实体(如用户,博客帖子,评论等)时,如何在地图缩减功能中区分它们?我正在考虑使用某种type
属性,对于每个项目,我只需要确保始终指定type
。当我阅读CouchDB
食谱网站时,这种思路有点强化,其中一个例子做同样的事情。
这是最可靠的方法,还是有更好的方法?我在考虑替代方案,我认为唯一的另一种方法是尽可能多地将其嵌入到逻辑文档中。比如,数据库内的直接记录都是User
条记录,每个User
都有一个Posts
数组,您只需在其中添加Posts
所有内容至。这里的缺点是嵌入式文档不会得到他们自己的id
属性,对吗?
答案 0 :(得分:7)
创建type
时,使用views
非常方便快捷。或者,您可以考虑使用JSON文档的一部分。即,而不是定义:
{
type: "user",
firstname: "John",
lastname: "Smith"
}
你会:
{
user: {
firstname: "John",
lastname: "Smith"
}
}
然后在发布包含user
信息的文档的视图中,而不是使用:
function (doc) {
if (doc.type === "user") emit(null, doc);
}
你会写:
function (doc) {
if (doc.user) emit(null, doc);
}
正如你所看到的,没有太大区别。正如您已经意识到第一种方法是最广泛使用的,但第二种方法(afaik)被广泛接受。
关于将一个Posts
的所有User
存储在一个文档中的问题。取决于您计划如何更新文档。请记住,每次更新时都需要编写整个文档(除非您使用attachments
)。这意味着每次用户编写新Post
时,您需要检索包含array
Posts
的文档,添加/修改一个元素并更新文档。可能太多(沉重)。