Join Couchdb参考文件
我是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
{
"_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,你的两个建议都很好。