couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ganzha Alexey <tret...@gmail.com>
Subject Re: 1 large view vs 2 smaller views
Date Sun, 24 Jul 2011 23:52:15 GMT
Thats the map function

function(doc) {
emit([doc.dep,doc.price,doc.date,doc._id]);
}

Thats the query i use:

/mydb/_design/mydb/_view/fetch?endkey=["auto", 0, ["0"],
""]&startkey=["auto", 1000000000000, ["9"], "\ufff0"]&descending=true

it returns me all docs with the dep "auto" sorted by price, if prices are
equal - by date, if price and date are equal - by _id

thats some answers for that query:

{"response":{"total_rows":16398,"offset":0,"rows":[
{"id":"60af978547e9aea0d530ffa634195844","key":["auto",610000000,["2011","07","13"],"60af978547e9aea0d530ffa634195844"],"value":null}},
{"id":"f905a48febec1c3e2b8023342f0b0a2e","key":["auto",17000000,["2011","07","08"],"f905a48febec1c3e2b8023342f0b0a2e"],"value":null}},

..

Its clear. I have no problem with that.

Now, i need only fetch docs added last week. I mark all that docs with
the attribute week:true.
It is a choice. transform present view, just adding 1 parameter to the
key like that:

function(doc) {
emit(['all', doc.dep,doc.price,doc.date,doc._id]);
if (doc.week)
emit(['week', doc.dep,doc.price,doc.date,doc._id]);
}

Now it is possible to get all docs like this

/mydb/_design/mydb/_view/fetch?endkey=["all", "auto", 0, ["0"],
""]&startkey=["all", "auto", 1000000000000, ["9"],
"\ufff0"]&descending=true

and 'week' docs like this

/mydb/_design/mydb/_view/fetch?endkey=["week", "auto", 0, ["0"],
""]&startkey=["week", "auto", 1000000000000, ["9"],
"\ufff0"]&descending=true

It will work.But the view transformed in such a way, will emit twice
for every document having 'week' attr,
and the key is increased. I thing it will grow rather large.

The other solution - is just to make second view, which will emit only
'week' docs.

Thats the question: what will you prefer? 1 solution (single view
emiting twice for some docs), or second (2 separate views).

Thanks.




On Mon, Jul 25, 2011 at 1:41 AM, Dennis Clark <dbfclark@gmail.com> wrote:

> You won't be able to use just that view to get the sorbability you want,
> then -- lexicographic ordering means that that your example will sequence
> your keys by doc.depth first, so you couldn't query and get all docs with
> the same date or date range.
>
> Perhaps best to step back a second and explain a little more about what
> you're trying to do? We can probably help, but only with a hair more input.
>
> On Jul 24, 2011, at 6:24 PM, Ganzha Alexey <tretiy3@gmail.com> wrote:
>
> > Thanks for your answer.
> >
> > Actually it is very important to sort by the other fields: dep, price.
> even
> > _id i need to separate docs with the same price.
> > So, the only way i see - this additional "week" (''THIS_IS_FOR_ALL'',
> > 'THIS_IS_FOR_LAST_WEEK_
> > ONLY') element in the key, at the first place. And i have to match this
> > element exactly for all docs, or for week docs.
> >
> >
> > On Mon, Jul 25, 2011 at 12:54 AM, Dennis Clark <dbfclark@gmail.com>
> wrote:
> >
> >> How important is it to you to have the view sorted by doc.dep? If the
> >> answer
> >> is "not at all," the idiomatically CouchDB way to do this is:
> >>
> >> emit(doc.date,[doc.dep,doc.price,doc._id]);
> >>
> >> and then let users query with startkey/endkey if they need only the docs
> >> from the last week. This way you don't need some "in the last week"
> field
> >> that you have to keep updated.
> >>
> >> On Sun, Jul 24, 2011 at 5:46 PM, Ganzha Alexey <tretiy3@gmail.com>
> wrote:
> >>
> >>> Hi.
> >>> I am trying figuring out whats the better.
> >>>
> >>> Say i have a view:
> >>> ...
> >>>   emit([doc.dep,doc.price,doc.date,doc._id]);
> >>> ...
> >>>
> >>> Some users need all docs. And some of them need only docs for the last
> >>> week.
> >>> Just add an attribute 'last_week' in required documents.
> >>> Then, in the view i will check this attribute and there are 2 cases:
> >>>
> >>> Filter docs in 1 view
> >>>
> >>> emit(['THIS_IS_FOR_ALL',doc.dep,doc.price,doc.date,doc._id]);
> >>>
> >>> if (doc.last_week)
> >>>
> >> emit(['THIS_IS_FOR_LAST_WEEK_ONLY',doc.dep,doc.price,doc.date,doc._id]);
> >>>
> >>> i will be able to query this view with the additional key member (will
> >> user
> >>> need all docs, or only last week docs)
> >>>
> >>> Or make 2 separate views. First:
> >>>
> >>> emit([doc.dep,doc.price,doc.date,'doc._id]);
> >>>
> >>> and  Second:
> >>>
> >>> if (doc.last_week)
> >>>   emit([doc.dep,doc.price,doc.date,doc._id])
> >>>
> >>> First case will emit more keys, and the keys will be larger by 1
> element.
> >>> But in second case, there are 2 views.
> >>>
> >>> What would you prefer. What is the better for performance?
> >>> Thanks
> >>>
> >>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message