Hi Jan,
Thanks for your reply, but i'm afraid that i have provided a lousy explanation
of the case i run in to. Let me explain with actual examples for i believe
Damien's examples do not fit my use case.
I have a tiny database with two types of documents, profile and
profileApplication. The profile type has an ID which is the user's e-mail
address and a simply username field, nothing more (see below for anatomy of
both document types).
{
"_id": "[email protected]",
"_rev": "1-5f7718ae8a627f4cf5b93b63420b7e1f",
"type": "profile",
"username": "markus17"
}
{
"_id": "1d2d9db700029557666e5d260b2ea038",
"_rev": "2-279daa538abc5cbb4b1524d29ce4ab53",
"type": "profileApplication",
"applicationId": "app2",
"profileId": "[email protected]",
"primaryId": 18
}
The documents with profileApplication type are related to both an application
(which i have omitted for now) and a profile. In RDBMS terms its purpose would
be a common link table.
The purpose for this relation is that a single profile can have a different
primaryId for different applications. My profile ([email protected]) would
have primaryId=18 for app2 and primaryId=17 for app1 etc.
The goal would be to retrieve both my profile document _and_ the primaryId
that goes with my profile for app1 or app2, ideally the query would be
key=["[email protected]", "app1"], but this is currently not possible.
There are two things i can do now:
1) retrieve the profile first and then fetch the primaryId for the application
i need, but this takes two requests and manually merging of the profile data
and primaryId;
http request 1:
http://localhost:5984/test/[email protected]
output:
{"_id":"[email protected]","_rev":"1-5f7718ae8a627f4cf5b93b63420b7e1f","type":"profile","username":"markus17"}
http request 2:
http://localhost:5984/test/_design/profiles/_view/getprimarybyemailandapplication?key=[%[email protected]%22,
%20%22app1%22]
output:
{"total_rows":4,"offset":2,"rows":[
{"id":"f51b92f4a59de0e28641375637a73050","key":["[email protected]","app1"],"value":17}
]}
It's clear that i need to merge the value of the second request with the
document received by the first.
2) fetch the profile and all related primaryIds in one go, this is one single
requests but i also get primaryId's for apps that i don't need so this fetches
more data and also needs clientside merging after i filtered out the app i
need.
http request 1:
http://localhost:5984/test/_design/profiles/_view/getprofileapplications?startkey=[%[email protected]%22]&endkey=[%[email protected]%22,
%20%22zzz%22]
output:
{"total_rows":6,"offset":3,"rows":[
{"id":"[email protected]","key":["[email protected]",1],"value":null},
{"id":"f51b92f4a59de0e28641375637a73050","key":["[email protected]","app1",2],"value":17},
{"id":"1d2d9db700029557666e5d260b2ea038","key":["[email protected]","app2",2],"value":18}
]}
It's clear that i need to filter my profile document and the
profileApplication document for the app i want (app1). The bad thing here is
that i do not get my profile document in the value (although i can emit it but
that's), if i include_docs i'll also get a lot of extra data on the documents
i don't need, here it's just one document but i can be many.
Both techniques work and have their pros and cons. But do you agree that it
would be much more convenient if we could simply construct views that carry
merged or combined documents using key=["[email protected]","app1"].
Am i correct to assume i cannot achieve the goal stated above without either
Chris' technique or merging of documents in one single view?
Please forgive me if i somehow didn't understand Damien's example but i
believe that deals with arithmetic instead of merging complex data structures.
I also didn't (yet?) feel that the new 0.11 linked documents feature will help
me out here. Also, i wish to keep this data in separate documents, keeping an
array within the profile document isn't really the best approach i think.
Cheers,
>See http://damienkatz.net/2008/02/incremental_map.html and
>http://damienkatz.net/2008/02/incremental_map_1.html and the
>comments on both.
Markus Jelsma - Technisch Architect - Buyways BV
http://www.linkedin.com/in/markus17
050-8536620 / 06-50258350