Join Couchdb参考文件

Join Couchdb参考文件,join,view,reference,couchdb,document,Join,View,Reference,Couchdb,Document,我是CouchDB的新手,正在努力实现一个基本示例。我有三个文档客户、联系人、地址,我想将它们合并到一个文档中 会计凭证 { "_id": "CST-1", "_rev": "8-089da95f148b446bd3b33a3182de709f", "name": "Customer", "code": "CST-001", "contact_Key": "CNT-001", "address_Key": "ADD-001", "type": "Cust

我是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": "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"
        }"

    }

我认为没有比先查询帐户文档,然后在知道其他两个帐户的ID后再查询它们更好的解决方案了。如果您仔细想想,这是有意义的,因为这些文档之间的唯一链接是存储在account文档中的ID,因此要同时获取这三个ID,DB必须在内部执行两个查询:首先是account文档,然后是其他两个查询。按照设计,CouchDB一次只执行一个查询

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

首先,您需要一个视图:

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"

您是否正在尝试将所有3个文档合并到map/reduce中?文档之间有什么链接?联系人密钥和联系人id不匹配。另外,你的地图功能只发送客户文档。嗨,伙计,我已经修复了id,是的,我想加入mal/reduce,但不知道如何获得结果。谢谢Simon,你的两个建议都很好。