有3种CouchDB文档类型:
用户名
{ "_id: "user/author1", "type: "user", "name" : "Joe Doe"}
审核
{ "_id: "review/review1", "type" : "review", "content" : "..." }
产品名称
{ "_id": "product/awesomeproduct", "type" : "product", "reviews": [
{
"author": "author1",
"review_id": "review/review1"
},
{
"author": "author2",
"review_id": "review/review2"
}
]
}
如何使用单一视图从文档中获取所有数据?
我尝试使用链接文档,但每个emit只能使用一个链接文档(include_docs=true):
(咖啡文稿)
(doc) ->
if doc.type is "product"
for review in doc.reviews
emit [doc._id, review.author],{_id: "user/" + review.author}
emit [doc._id, review.author],{_id: review.review_id}
但我想要这样的东西(在单一发射中获取用户和审阅文档):
(doc) ->
if doc.type is "product"
for review in doc.reviews
key = [doc._id, review.author]
value = {"user:" {_id: "user/" + review.author},"review" :{_id: review.review_id}}
emit key, value
是否有任何可能的方法如何实现它?如何在单一视图中加入这些类型的文档?
我想得到这样的结果:
[
key : ["product/awesomeproduct", "author1"],
value : {user: {_id: "user/author1"},review :{_id: "review/review1"}}
doc:
{user: {"_id: "user/author1", "type: "user", "name" : "Joe Doe"},
review: {"_id: "review/review1", "type" : "review", "content" : "..."}
}
]
3条答案
按热度按时间3qpi33ja1#
看起来像是reduce函数的经典案例(抱歉,我没有咖啡:)):
Map
减少
结果(?reduce=true[&group=精确]):
您到底希望发出的数据看起来像什么?
对上面注解的响应应该是可能的,除了您希望在视图的返回文档中显示数据的方式。include_docs表示返回整个文档,按原样返回。似乎您希望在视图和返回的文档中以相同的方式表示数据,因此可能需要将文档的结构更改为:
否则,如果您只希望视图键、值为上述结构,而不关心返回的文档的结构:
Map
这将导致:
这并不像是你要找的,但这是我最好的猜测。
kg7wmglp2#
简短的回答...你不能。Couchdb一次只允许你发出一个文档。
有两种方法可以获取所需的数据。
1.保持结构不变,并在客户端代码中手动执行连接。
1.反规范化您的数据。这里的反规范化类似于将评论放在您的产品文档中。
Data modeling considerations适用于Mongodb,但有关如何在NoSQL环境中构建数据的概念与适用于CouchDB的概念相同
tmb3ates3#
您可以在下面这样做,
这将在相关视图中发出两个文档。