Couchdb 使用键连接两个文档
Couchdb join two documents using key
我有两个文档,一个是树结构,另一个与第一个文档有关。我正在尝试通过 fk 和 pk 加入这两个文档。我无法得到实际结果,它显示所有空值。
第一个文档
{
"name": "one",
"root": {
"level1" : {
"level2" : {
"level3" : {
"itemone": "Randomkey1",
"itemtwo": "Randomkey2
}
}
}
},
"type": "firstdoc"
}
第二个文档
{
"name" : "two",
"mapBy" : "Randomkey1",
"type" : "senconddoc
}
我写了一个映射函数,它列出了给定级别 1 或 2 或 3 的所有键。现在我想使用密钥加入第一个文档和第二个文档。我尝试了两种方法(第一种:我得到了所有(Root,Randomkey),(docName,Randomkey1)但它没有做任何连接。我正在寻找类似的结果
(Root, docName)
有人可以帮忙解决这个问题吗
地图
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 功能连接不同的级别,确保以正确的方式使用它,同时使用日志记录以便您能够知道 map/reduce 功能的顺序由 CouchDB 调用。
此外,map 函数应该只用于发出所需的文档假设如果你想发出你的 level3 那么在发出的值部分,root.level1.level2.level3 应该在那里。
有关加入的更多详细信息,您可以参考
CouchDB Join using Views (map/reduce)
我有两个文档,一个是树结构,另一个与第一个文档有关。我正在尝试通过 fk 和 pk 加入这两个文档。我无法得到实际结果,它显示所有空值。
第一个文档
{
"name": "one",
"root": {
"level1" : {
"level2" : {
"level3" : {
"itemone": "Randomkey1",
"itemtwo": "Randomkey2
}
}
}
},
"type": "firstdoc"
}
第二个文档
{
"name" : "two",
"mapBy" : "Randomkey1",
"type" : "senconddoc
}
我写了一个映射函数,它列出了给定级别 1 或 2 或 3 的所有键。现在我想使用密钥加入第一个文档和第二个文档。我尝试了两种方法(第一种:我得到了所有(Root,Randomkey),(docName,Randomkey1)但它没有做任何连接。我正在寻找类似的结果 (Root, docName)
有人可以帮忙解决这个问题吗
地图
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 功能连接不同的级别,确保以正确的方式使用它,同时使用日志记录以便您能够知道 map/reduce 功能的顺序由 CouchDB 调用。
此外,map 函数应该只用于发出所需的文档假设如果你想发出你的 level3 那么在发出的值部分,root.level1.level2.level3 应该在那里。
有关加入的更多详细信息,您可以参考
CouchDB Join using Views (map/reduce)