Vizualizare CouchDB cu 2 taste

Caut o soluție generală la o problemă cu vederile couchdb.

De exemplu, aveți un rezultat de vizualizare astfel:

{"total_rows":4,"offset":0,"rows":[
{"id":"1","key":["imported","1"],"value":null},
{"id":"2","key":["imported","2"],"value":null},
{"id":"3","key":["imported","3"],"value":null},
{"id":"4","key":["mapped","4"],"value":null},
{"id":"5,"key":["mapped","5"],"value":null}
]

1) Dacă vreau să selectez numai documentele "importate", aș folosi acest lucru:

view?startkey=["imported"]&endkey=["imported",{}]

2) Dacă vreau să selectați toate documentele importate cu un id mai mare decât 2:

view?startkey=["imported",2]&endkey=["imported",{}]

3) Dacă vreau să selectați toate documentele importate cu un id între 2 și 4:

view?startkey=["imported",2]&endkey=["imported",4]

Cunoașterea mea este: Cum pot selecta toate rândurile cu un id între 2 și 4?

0
Singurul motiv este că am o mulțime de cazuri cu aceeași problemă și vreau să evit să "public" toate aceste opinii ... Am nevoie de acest lucru pentru derularea funcțiilor ..
adăugat autor bernhardh, sursa
Orice motiv pentru care nu puteți avea o vizualizare separată care emite doar paramul 2?
adăugat autor Dominic Barnes, sursa

2 răspunsuri

Am intrat în aceeași problemă cu puțin timp în urmă, așa că îmi voi explica soluția. În interiorul oricărei funcții de hartă puteți avea mai multe apeluri emit() . O funcție de hartă în cazul dvs. ar putea să arate:

function(doc) {
  emit([doc.number, doc.category], null);
  emit([doc.category, doc.number], null);
}

De asemenea, puteți utiliza ? Include_docs = true pentru a obține documentele din orice dintre interogările dvs. Apoi interogarea dvs. pentru a obține înapoi rândurile 2 - 4 ar fi

view?startkey=[2]&endkey=[4,{}]

You can view the rules for sorting at CouchDB View Collation

0
adăugat
Multumesc pentru raspunsul tau! Dar această soluție este chiar mai mare pentru a face două puncte de vedere, deoarece în această soluție nu știți dacă un rând de rezultate este un element [număr, categorie] sau [categorie, număr]. Adică nu știți dacă primul element cheie este o categorie sau un număr (dacă, de exemplu, ambele sunt șiruri de caractere).
adăugat autor bernhardh, sursa
numărul/categoria este doar un exemplu, ați putea să-l numiți, de asemenea, grupName și categoryName sau altceva ... sau oraș și categorie ..
adăugat autor bernhardh, sursa
@ leftjustified: Există un motiv că numărul din cheie trebuie să fie un șir?
adăugat autor tsliwkan, sursa

Puteți încerca să extindeți soluția de mai sus, dar prefixați cheile cu un fel de pavilion "emit index" astfel:

map: function (doc) {
  emit ([0, doc.number, doc.categsauy]);//direct sauder
  emit ([1, doc.categsauy, doc.number]);//reverse sauder
}

astfel încât veți putea să le cereți

view?startkey=[0, 2]&endkey=[0, 4, {}]

sau

view?startkey=[1, 'impsauted', 2]&endkey=[1, 'impsauted', 4]

Dar 2 puncte de vedere diferite vor fi mai bine oricum.

0
adăugat
Ok, cred că nu există altă soluție decât crearea a două vederi separate
adăugat autor bernhardh, sursa