Related CouchDB docs in view

I'm having a hard time touching the CouchDB feature of linked docs .

I have two types

data stored in the same CouchDB database:

{
  "id":"1",
  "type": "track",
  "title": "Bohemian Rhapsody"
}

{
  "id":"2",
  "type": "artist",
  "name": "Queen",
  "tracks": ["1"]
}

      

I am under the impression that I can write a view like the one below and get the following docs released:

{
  "id":"2",
  "type": "artist",
  "name": "Queen",
  "tracks": [
    {
      "id":"1",
      "type": "track",
      "title": "Bohemian Rhapsody"
    }
  ]
}

      

I tried this view, but it doesn't work as I expect:

function(doc) {
  if(doc.type == 'artist') {
    var tracks = [];
    for(var i = 0; i < doc.tracks.length; i++) {
      tracks.push({_id:doc.tracks[i]});
    }

    newdoc = eval(uneval(doc));
    newdoc.tracks = tracks;

    emit(doc._id,newdoc);
  }
}

      

Example here: http://jphastings.iriscouch.com/_utils/database.html?music/_design/test/_view/linked

This does not return what I hope, do you have any suggestions? Thanks to

+3


source to share


1 answer


Ok, I finally figured out what you are trying to do. Yes it is possible. Here's how.

You have 2 documents

{
"_id":"anyvalue",
"type": "track",
"title": "Bohemian Rhapsody"
}

{
"_id":"2",
"type": "artist",
"name": "Queen",
"tracks": ["anyvalue"]
}

      

What you were doing wrong was not having quotes around the track value (element in the array).

2) Link id must be _id for this to work. The difference is worth noting as you can have an id field, but only _id is used to identify documents.

As a result, you want this view to be enough

function(doc) {
    if (doc.type === 'artist') {
        for (var i in doc.tracks) {
            var id = doc.tracks[i];
            emit(id, { _id: id });
        }
    }
}

      

What you want to do is use the emit function inside the for loop to emit the "track" id field of each artist.



Then you want to query the db couch view with include_docs = true parameter. Here is the final result for a database created on a diaphragm sofa.

http://jphastings.iriscouch.com/music/_design/test/_view/nested?reduce=false&include_docs=true

 {
"total_rows": 3,
"offset": 0,
"rows": [
 {
  "id": "0b86008d8490abf0b7e4f15f0c6a50a7",
  "key": "0b86008d8490abf0b7e4f15f0c6a463b",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a463b"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a463b",
    "_rev": "3-7e4ba3bfedd29a07898125c09dd7262e",
    "type": "track",
    "title": "Boheniam Rhapsody"
  }
},
{
  "id": "0b86008d8490abf0b7e4f15f0c6a50a7",
  "key": "0b86008d8490abf0b7e4f15f0c6a5ae2",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a5ae2"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a5ae2",
    "_rev": "2-b3989dd37ef4d8ed58516835900b549e",
    "type": "track",
    "title": "Another one bites the dust"
  }
},
{
  "id": "0b86008d8490abf0b7e4f15f0c6a695e",
  "key": "0b86008d8490abf0b7e4f15f0c6a6353",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a6353"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a6353",
    "_rev": "2-0383f18c198b813943615d2bf59c212a",
    "type": "track",
    "title": "Stripper Vicar"
  }
 }
]
}

      

Jason explains this post perfectly

Best way to do a one-to-many "JOIN" in CouchDB

this link is also useful for entity relationships in db cube

http://wiki.apache.org/couchdb/EntityRelationship

+4


source







All Articles