只是玩弄CouchDb和CouchApp,这是多么神奇的技术!非常惊讶,接缝非常强大。经过阅读和阅读后,由于我是一位古老的关系数据库用户,我仍然质疑自己如何设计一些基本的东西。
这是我的问题:
1 /我有一个'用户'类型的文件和'item'类型的文件
2 /我的Couchdb包含以下文件:
{ "_id": "...", "type": "user", "email":"u1@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u2@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u3@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u4@gmail.com" ... }
{ "_id": "...", "type": "item", "title":"My title",
created_by:"u1@gmail.com", modified_by:"u3@gmail.com" }
3 /现在我希望通过type = item和_id为每个用户(创建者和修饰符)提供信息来获取视图或其他东西
我在这里看到了一种模拟简单连接的方法:http://www.cmlenz.net/archives/2007/10/couchdb-joins
但是我不能适应它的两个连接,我几个小时就玩关键格式,测试很多东西,但没有任何作用。
我想,我错过了CouchDb map / reduce的重要内容,如果有人有帮助我会很感激。
PS:请勿回答我在'item'文档中插入'user'文档。这不是我的问题。
放松,放松......: - )
答案 0 :(得分:2)
我认为你应该将_id
放入created_by
和modified_by
:
{ "_id": "u1", "type": "user", "email":"u1@gmail.com" ... }
{ "_id": "u2", "type": "user", "email":"u2@gmail.com" ... }
{ "_id": "u3", "type": "user", "email":"u3@gmail.com" ... }
{ "_id": "u4", "type": "user", "email":"u4@gmail.com" ... }
{ "_id": "anitem", "type": "item", "title":"My title",
created_by:"u1", modified_by:"u3" }
因此您可以使用以下地图功能并使用?key="anitem"&include_docs=true
进行查询:
function(doc) {
if (doc.type === "item") {
emit(doc._id, 1);
emit(doc._id, { _id: doc.created_by });
emit(doc._id, { _id: doc.modified_by });
}
}
您可以阅读Jan Lehnardt's post about it了解详情。
作为旁注,我通常会将类型放在_id
中,以便更容易获得唯一键,如果您只想按类型过滤,则不需要视图:
{ "_id": "user/username1", "email":"u1@gmail.com" ... }
{ "_id": "user/username2", "email":"u2@gmail.com" ... }
{ "_id": "user/username3", "email":"u3@gmail.com" ... }
{ "_id": "user/username4", "email":"u4@gmail.com" ... }
{ "_id": "item/itemid1", "title":"My title",
created_by:"user/username1", modified_by:"user/username3" }
并且地图功能是
function(doc) {
if (doc._id.slice(0, 4) === "item/") {
emit(doc._id, 1);
emit(doc._id, { _id: doc.created_by });
emit(doc._id, { _id: doc.modified_by });
}
}
更新:由于错误COUCHDB-1229,在/
中使用doc._id
可能会导致问题。根据您的使用情况,最好使用其他分隔符,例如:
或_
。
答案 1 :(得分:0)
你在这里说“两个连接”是什么意思?这是“tableA join tableB ON ...... AND ...”?
现在我想要一个视图或者其他东西来获取type = item和_id以及每个用户的信息来获取文档
这可以在没有两个/更多连接的情况下完成。 无论如何,我的建议是将您的数据分成2个数据库:items&用户。上面的例子只适合几个简单的任务。但是,当您的数据变得越来越大(比如10K用户和100K项目)时,处理您的数据变得非常困难,而且只有一个字段,所有文档彼此不同,这有点糟糕。