2015-01-31 3 views
2

У меня есть два документа, один с древовидной структурой, а другой - с первым документом. Я пытаюсь присоединиться к этим двум документам через fk и pk. Я не мог получить фактические результаты, и он отображает все нулевые значения.Couchdb присоединяется к двум документам, используя ключ

Первый документ

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

Второй документ

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

I`ve написал функцию карты, в котором перечислены все ключи, данные уровня 1 или 2 или 3. Теперь я хочу o присоединиться к этому первому документу и второму документу с помощью ключа. Ive попробовал два способа (сначала: Im get all (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); 
} 
} 

ответ

5

для имитации присоединяется вы должны выводить документ с _id в нем, значение _id нужно указать реальное _id документа. После этого вы можете использовать include_docs=true для привлечения соответствующих документов. Пример со многими для многих re: http://danielwertheim.se/couchdb-many-to-many-relations/

Если это не применимо, вы можете сделать двухэтапное ручное соединение, сначала вернув пользовательские ключи. Затем сделайте второй запрос против представления всех документов, указав несколько ключей.

+0

Даниэль, я пытаюсь понять, как будет работать вторая альтернатива. Вы имеете в виду написать два представления, затем запросить один и использовать его ответ, чтобы настроить запрос на другой в клиенте? –

+0

@AhmedFasih nope, один вид для возврата ключей, которые сопоставляются с идентификаторами требуемых документов, затем выдает второй запрос в отношении представления all_docs (системный вид), соответствующего этим идентификаторам. Но я бы держался подальше от объединений, если бы мог, в Couch (на самом деле не используя Couch больше BTW) – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^