CouchDB View JSON Object Layout with Inline Arrays from Two Separated Documents

Suppose I have two types of documents stored in my CouchDB database. Firstly, with a property type set to a contact and second by phone . A contact type document has another property called a name. The phone type has a property number and contact_id so that it can refer to the contact person. This is a trivial scenario for many, when one contact can have N phone numbers (I know that they can be embedded in one contact document, but I need to demonstrate one or many relationships with different documents).

Unusual example data with Scott having 2 phone numbers and Matt with 1 number:

{_id: "fc93f785e6bd8c44f14468828b001109", _rev: "1-fdc8d121351b0f5c6d7e288399c7a5b6", type: "phone", number: "123456", contact_id: "fc93f785e6bd8c44f14468828b00099f"}
{_id: "fc93f785e6bd8c44f14468828b000f6a", _rev: "1-b2dd90295693dc395019deec7cbf89c7", type: "phone", number: "465789", contact_id: "fc93f785e6bd8c44f14468828b00099f"}
{_id: "fc93f785e6bd8c44f14468828b00099f", _rev: "1-bd643a6b0e90c997a42d8c04c5c06af6", type: "contact", name: "Scott"}
{_id: "16309fcd03475b9a2924c61d690018e3", _rev: "1-723b7c999111b116c353a4fdab11ddc0", type: "contact", name: "Matt"}
{_id: "16309fcd03475b9a2924c61d69000aef", _rev: "3-67193f1bfa8ed21c68e3d35847e9060a", type: "phone", number: "789456", contact_id: "16309fcd03475b9a2924c61d690018e3"}

Card Function:

function(doc) {
  if (doc.type == "contact") {
    emit([doc._id, 1], doc);
  } else if (doc.type == "phone") {
    emit([doc.contact_id, 0], doc);
  }
}

Decrease function:

function(keys, values) {
  var output = {};

  for(var elem in values) {
    if(values[elem].type == "contact") {
      output = {
        "ID": values[elem]._id,
        "Name": values[elem].name,
        "Type": values[elem].type,
        "Phones": []
      };
    } else if (values[elem].type == "phone") {
      output.Phones.push({ 
        "Number": values[elem].number, 
        "Type": values[elem].type 
      });
    }
  }

  return output;
}

group_level 1 - Map. , :

http://localhost:5984/testdb2/_design/testview/_view/tv1?group_level=1

- :

http://localhost:5984/testdb2/_design/testview/_view/tv1?group_level=1&startkey=[%22fc93f785e6bd8c44f14468828b00099f%22]&endkey=[%22fc93f785e6bd8c44f14468828b00099f%22,{}]

, - . : MapReduce CouchDB? - ?

+5
2

, emit(...,doc).

, . . , - , .

, , CouchDB , . , , . - .: -)

, - - CouchDB:

function(doc) {
  if (doc.type == "contact") {
    emit([doc._id, 0], {
        "Name": doc.name,
        "Type": doc.type
    });
  } else if (doc.type == "phone") {
    emit([doc.contact_id, 1], {
        "Number": doc.number,
        "Type": doc.type
    });
  }
}

, :

http://localhost:5984/testdb2/_design/testview/_view/tv1?
  startkey=[%22fc93f785e6bd8c44f14468828b00099f%22, 0]
  &endkey=[%22fc93f785e6bd8c44f14468828b00099f%22,1]

, JSON, , , CouchDB.

+7

, , " " CouchDB. - , . ( , .)

, , (0) (1)? .

0

All Articles