Couchdb 使用 key 连接两个文档



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

第一个文档

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

第二个文档

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

我写了一个 map 函数,它列出了所有给定级别 1、2 或 3 的键。现在我想使用密钥加入第一个文档和第二个文档。我尝试了两种方法(第一种:我获取所有(根,随机键),(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);
}
}

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

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

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

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

现在可以使用Map Reduce函数连接不同的级别,确保您将以正确的方式使用它,还可以使用日志记录,以便您能够知道CouchDB正在调用哪个序列map/reduce函数。

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

有关连接的更多详细信息,您可以参考

使用视图的CouchDB连接(映射/减少)

相关内容

  • 没有找到相关文章

最新更新