创建一个视图以在CouchDb中获取多个文档

时间:2015-05-21 10:16:56

标签: couchdb nosql

CouchDb新手在这里。

我在CouchDb中有几个具有相同结构的文档:

{
    "_id": "1170140286",
    "_rev": "1-79ffad4d4cbe24effc72f9ec519373ca",
    "data": [
        {
            "photo": "link_of_photo1",
            "userid": "34623",
            "username": "guest-user1"
        },
        {
            "photo": "link_of_photo2",
            "userid": "34623",
            "username": "guest-user1"
        },
        {
            "photo": "link_of_photo3",
            "userid": "34623",
            "username": "guest-user1"
        }
    ]
}

{
    "_id": "43573458",
    "_rev": "1-0ca5aa68590fcb58399fe059aa8fb881",
    "data": [
        {
            "photo": "link_of_photo1",
            "userid": "6334",
            "username": "guest-user2"
        },
        {
            "photo": "link_of_photo2",
            "userid": "6334",
            "username": "guest-user2"
        },
        {
            "photo": "link_of_photo3",
            "userid": "6334",
            "username": "guest-user2"
        }
    ]
}

我不知道我想做什么是可能的,但我正在尝试创建一个将这些文档的数据元素合并为一个文档的视图:

[
    {
        "photo": "link_of_photo1",
        "userid": "34623",
        "username": "guest-user1"
    },
    {
        "photo": "link_of_photo2",
        "userid": "34623",
        "username": "guest-user1"
    },
    {
        "photo": "link_of_photo3",
        "userid": "34623",
        "username": "guest-user1"
    },
    {
        "photo": "link_of_photo1",
        "userid": "6334",
        "username": "guest-user2"
    },
    {
        "photo": "link_of_photo2",
        "userid": "6334",
        "username": "guest-user2"
    },
    {
        "photo": "link_of_photo3",
        "userid": "6334",
        "username": "guest-user2"
    }
]

我很确定我无法正确理解couchdb的逻辑,所以任何帮助都是高度预测的。

2 个答案:

答案 0 :(得分:0)

您可以获得包含所有链接的视图结果。它将是一个数组,但与您的模拟结果结构看起来有点不同。视图逻辑可能看起来像(示例中未使用行的键 - 也许用户名或id是一个有用的值):

function (doc) {
  var data = doc.data
  if (!data) return

  for (var i = 0, link; link = data[i++];)
    emit(null, link)
}

为了完整起见,应该提到有一种方法可以“合并所有文档”服务器端。在数据最终发送回请求者之前,可以通过CouchDB列表操纵视图结果。 But.it.is.not.recommended!请认真对待并且不要尝试 - 这是一个巨大的性能问题,并且从未成为CouchDB提供此类用例的目标。

答案 1 :(得分:-2)

请参阅这些链接。

http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents

CouchDB "Join" two documents

combine multiple documents in a couchdb view

示例代码:

function(doc){
if(doc.items)
doc.items.forEach(function(item){
      emit(doc._id,{_id:item});
  })

}

我希望这些可以解决你的问题。