【问题标题】:CouchDB's Linked Documents in a ViewCouchDB 在视图中的链接文档
【发布时间】:2013-01-30 10:33:07
【问题描述】:

我很难理解 CouchDB 的 linked documents 功能。

我有两个 types 的数据存储在一个 CouchDB 数据库中:

{
  "id":"1",
  "type": "track",
  "title": "Bohemian Rhapsody"
}

{
  "id":"2",
  "type": "artist",
  "name": "Queen",
  "tracks": ["1"]
}

我的印象是我可以编写如下视图并发出以下文档:

{
  "id":"2",
  "type": "artist",
  "name": "Queen",
  "tracks": [
    {
      "id":"1",
      "type": "track",
      "title": "Bohemian Rhapsody"
    }
  ]
}

我一直在尝试这个视图,但它没有按我预期的方式工作:

function(doc) {
  if(doc.type == 'artist') {
    var tracks = [];
    for(var i = 0; i < doc.tracks.length; i++) {
      tracks.push({_id:doc.tracks[i]});
    }

    newdoc = eval(uneval(doc));
    newdoc.tracks = tracks;

    emit(doc._id,newdoc);
  }
}

此处的示例:http://jphastings.iriscouch.com/_utils/database.html?music/_design/test/_view/linked

这并没有返回我希望的结果 - 你有什么建议吗?谢谢

【问题讨论】:

  • 我认为不可能这样。在视图中,一次处理一个文档。因此,如果 id1 和 id2 是 2 个文档,则首先处理 id1,然后处理 id 2。跨度>
  • 我添加了一个带有视图 (linked) 的设计文档 (dominicbarnes) 注意添加了 include_docs=true。视图本身被大量评论。
  • 另外,我添加了_count 作为reduce 函数,将它与group_level=1 一起使用会显示每个艺术家/收藏中列出了多少文档。

标签: couchdb


【解决方案1】:

好的,我终于明白你要做什么了。是的,这是可能的。这就是方法。

您有 2 个文件

{
"_id":"anyvalue",
"type": "track",
"title": "Bohemian Rhapsody"
}

{
"_id":"2",
"type": "artist",
"name": "Queen",
"tracks": ["anyvalue"]
}

你做错了没有在轨道的值(数组中的项目)周围加上引号。

2) 参考 id 必须是 _id 才能工作。区别值得注意,因为您可以有 id 字段但只有 _id 用于识别文档。

对于你想要的结果,这个视图就足够了

function(doc) {
    if (doc.type === 'artist') {
        for (var i in doc.tracks) {
            var id = doc.tracks[i];
            emit(id, { _id: id });
        }
    }
}

您要做的是在 for 循环中使用一个 emit 函数来发出每个艺术家的“轨道”的 id 字段。

然后您想使用 include_docs=true 参数查询 couch db 视图。这是您在 iris couch 上创建的数据库的最终结果。

http://jphastings.iriscouch.com/music/_design/test/_view/nested?reduce=false&include_docs=true

 {
"total_rows": 3,
"offset": 0,
"rows": [
 {
  "id": "0b86008d8490abf0b7e4f15f0c6a50a7",
  "key": "0b86008d8490abf0b7e4f15f0c6a463b",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a463b"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a463b",
    "_rev": "3-7e4ba3bfedd29a07898125c09dd7262e",
    "type": "track",
    "title": "Boheniam Rhapsody"
  }
},
{
  "id": "0b86008d8490abf0b7e4f15f0c6a50a7",
  "key": "0b86008d8490abf0b7e4f15f0c6a5ae2",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a5ae2"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a5ae2",
    "_rev": "2-b3989dd37ef4d8ed58516835900b549e",
    "type": "track",
    "title": "Another one bites the dust"
  }
},
{
  "id": "0b86008d8490abf0b7e4f15f0c6a695e",
  "key": "0b86008d8490abf0b7e4f15f0c6a6353",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a6353"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a6353",
    "_rev": "2-0383f18c198b813943615d2bf59c212a",
    "type": "track",
    "title": "Stripper Vicar"
  }
 }
]
}

Jason 在这篇文章中精彩地解释了它

Best way to do one-to-many "JOIN" in CouchDB

此链接也有助于沙发数据库中的实体关系

http://wiki.apache.org/couchdb/EntityRelationship

【讨论】:

  • 感谢引号中的指针,我认为这只是匆忙输入 Stackoverflow!我不确定我是否遵循您的第二个答案。我已经注册了一个帐户,但它似乎还没有设置。
  • 如果你想看蒲团,你必须去一个像这样的网址 http:\\username.iriscouch.com/_utils/index.html。你的数据库是username.irisouch.com
  • 这是 iriscouch 中的上述数据(以及第二个示例):jphastings.iriscouch.com/_utils/database.html?music/_design/…
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多