【问题标题】:Couchdb join two documents using keyCouchdb 使用键连接两个文档
【发布时间】:2015-03-30 15:52:54
【问题描述】:

我有两个文档,一个具有树结构,另一个与第一个文档相关。我试图通过 fk 和 pk 加入这两个文档。我无法得到实际结果,它显示所有空值。

第一个文档

{
   "name": "one",
   "root": {
            "level1" : {
                       "level2" : {
                                 "level3" : {
                                           "itemone": "Randomkey1",
                                           "itemtwo": "Randomkey2
                                          }
                                }
                     }
         },
   "type": "firstdoc"
}

第二个文档

{
    "name"  : "two",
    "mapBy" : "Randomkey1",
    "type"  : "senconddoc
}

我编写了一个 map 函数,它列出了给定级别 1 或 2 或 3 的所有键。现在我想使用密钥加入第一个文档和第二个文档。我尝试了两种方法(第一种:我得到所有(Root,Randomkey),(docName,Randomkey1)但它没有做任何加入。我正在寻找类似的结果 (根,文档名)

有人可以帮忙解决这个问题

地图

function(doc) {
   if (doc.type === 'firstdoc' || doc.type === 'seconddoc' ) {
      var rootObj = doc.Root;
      for (var level1 in rootObj) {

         var level2Obj = doc.Root[level1];

         for (var level2 in level2Obj) {

           var keys = new Array();
            var level3Obj = level2Obj[level2];

            for (var i in level3Obj) {

                var itemObj = level3Obj[i];

                for (var i in itemObj) {
                    keys.push(itemObj[i]);

                    emit(doc.name, [itemObj[i], 0]);

                     var firstDocName = doc.name;

                    //This is gives null values
                    if (doc.Type === 'senconddoc' && doc.mapBy === itemObj[i]) {

                         emit(firstDocName , doc);
                    }
                }
            }



        }


    }
}

//This just lists keys to me
if (doc.type === 'senconddoc') {

    emit([doc.mapBy, 1] , doc);
}
}

【问题讨论】:

    标签: javascript join mapreduce couchdb relational-algebra


    【解决方案1】:

    要模拟连接,您必须输出一个包含_id 的文档,_id 的值需要指向文档的实际_id。然后你可以使用include_docs=true拉取相关文件。这里的多对多示例:http://danielwertheim.se/couchdb-many-to-many-relations/

    如果这不适用,您可以通过首先返回自定义键来进行两步手动连接。然后对所有文档视图进行第二次查询,指定多个键。

    【讨论】:

    • Daniel,我正在尝试了解第二种选择的工作原理。你的意思是写两个视图,然后查询一个,并使用它的响应来定制客户端中的另一个查询?
    • @AhmedFasih 不,一个视图返回映射到所需文档 ID 的键,然后针对匹配这些 ID 的 all_docs 视图(系统视图)发出第二个查询。但如果我可以在沙发上,我会远离连接(顺便说一句,我不再真正使用沙发了)
    • @Daniel 那你用什么代替?
    【解决方案2】:

    已经很晚了,但是对于这种树状结构,文档应该分开保存,例如

    {
      id="firstDoc",
      type="rootLevel"
    }
    {
      id="secondDoc",
      type="firstLevel"
      parent="firstDoc"
    }
    {
      id="thirdDoc",
      type="firstLevel",
      parent="firstDoc"
    }
    

    现在可以使用 Map Reduce 函数连接不同的级别,确保以正确的方式使用它,同时使用 Logging,以便您能够知道 CouchDB 调用 map/reduce 函数的顺序。

    此外,map 函数应该只用于发出所需的文档,假设如果你想发出你的 level3,那么在发出的 value 部分,root.level1.level2.level3 应该在那里。

    有关加入的更多详细信息,您可以参考

    CouchDB Join using Views (map/reduce)

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多