2014-02-19 50 views
1

我是CouchDB的新手,努力实现一个基本示例。我有三个文件客户,联系人,地址,我想将它们合并成一个文件。Couchdb参考文档

帐户文件

{ 
    "_id": "CST-1", 
    "_rev": "8-089da95f148b446bd3b33a3182de709f", 
    "name": "Customer", 
    "code": "CST-001", 
    "contact_Key": "CNT-001", 
    "address_Key": "ADD-001", 
    "type": "Customer" 
} 

联系文档

{ 
     "_id": "CNT-001", 
     "_rev": "8-079da95f148b446bd3b33a3182de709g", 
     "fullname": "Happy Swan", 
     "type": "Contact" 
    } 

地址文件

{ 
     "_id": "ADD-001", 
     "_rev": "8-179da95f148b446bd3b33a3182de709c", 
     "street1": "9 Glass View", 
     "street2": "Street 2", 
     "city": "USA", 
     "type": "Address" 
    } 

地图/查询:

var map= function (doc) { 
     if (doc.type === 'Customer') { 
     emit(doc.id, { contact_Key: doc.contact_Key, address_Key: doc.address_Key }) 
     } 
    }; 

db.query({ map: map }, { include_docs: true }, function (err, res) { 

}); 

当我查询帐户时,我希望在单个文档中记录所有3个文档。

预期的结果

{ 
     "_id": "CST-1", 
     "_rev": "8-089da95f148b446bd3b33a3182de709f", 
     "name": "Customer", 
     "code": "CST-001", 
     "contact_Key": "CNT-001", 
     "address_Key": "ADD-001", 
     "type": "Customer", 
     "Contact: { 
        "_id": "CNT-001", 
        "_rev": "8-079da95f148b446bd3b33a3182de709g", 
        "fullname": "Happy Swan", 
        "type": "Contact" 
     }", 
     "Address: { 
      "_id": "ADD-001", 
      "_rev": "8-179da95f148b446bd3b33a3182de709c", 
      "street1": "9 Glass View", 
      "street2": "Street 2", 
      "city": "USA", 
      "type": "Address" 
     }" 

    } 
+0

你尝试加入所有3里面的文件/ reduce?什么链接文档? 'contact_Key'和Contact的'_id'不匹配。另外,您的“地图”功能只能发送客户文件。 – TheDude

+0

嗨,老兄我已经修好了ID,是的,我想加入然后内部马尔/减少,但不知道如何得到结果。 – yaadgar

回答

0

我没有看到比第一查询帐户文件,然后查询其他两个,一旦你知道它们的ID任何更好的解决方案。如果你仔细想一想,这是有道理的,因为这些文件之间的唯一联系是存储在账户文件中的ID,因此为了同时获得所有三个文件,在内部DB必须做两个查询:首先是账户文件,然后是另外两个。通过设计,CouchDB一次只能执行一个查询。

但是,如果您将帐户doc ID存储到联系人和地址文档中,则可以使用list function将它们合并为一个。

首先你需要一个观点:

function(doc) { 
    if (doc.type === 'Customer') { 
    emit(doc._id, doc); 
    } 
    if (doc.type === 'Contact' || doc.type === 'Address') { 
    emit(doc.account_id, doc); 
    } 
} 

然后列表功能:

function(head, req) { 
    var row, account, contact, address; 
    while (row = getRow()) { 
    if (row.value.type === 'Customer') { 
     account = row.value; 
    } else if (row.value.type === 'Contact') { 
     contact = row.value; 
    } else if (row.value.type === 'Address') { 
     address = row.value; 
    } 
    } 
    account['Contact'] = contact; 
    account['Address'] = address; 
    provides("json", function() { 
    return { 'json': account }; 
    }); 
} 

而且你将与查询它:

GET /db/_design/foo/_list/the-list/the-view?key="CST-1" 
+0

谢谢西蒙,你的建议都很棒。 – yaadgar