2013-03-07 13 views
8

Come ottenere dati da CouchDB, filtraggio su più campi.Ricerca multicriterio con CouchDB

Ad esempio, se si dispone di un database di persone con campi come Nome, Stato, Paese ecc .; e un modulo di ricerca su una pagina Web, Come ottengo i dati da CouchDB, considerando solo le condizioni non nulle.

in SQL, vorrei aggiungere condizioni alla clausola WHERE WHERE Person.Name="John" AND Person.State in ("NY","CA"), ma come faccio a incorniciano questa query come CouchDB View

risposta

7

In CouchDB si utilizza la mappa/ridurre Vista. In SQL devi dire esplicitamente per quale indice di campo verrà creato. In CouchDB si scrive indice di creazione di funzioni personalizzate, quindi può essere più specifico per le proprie esigenze. Se si desidera che l'indice per una cosa così semplice come una ricerca con il nome, stato e paese campi la vista è semplicemente una funzione di mappa:

function (doc) { 
    if (doc.name && doc.state && doc.country) 
    emit([doc.name, doc.state, doc.country], doc); 
} 

effettuare la ricerca utilizzando questo punto di vista si cerca la chiave ["my_name", "my_state", "my_country"]. È possibile utilizzarlo per eseguire query con sottoinsieme di nome, stato e paese purché siano un prefisso dell'array emesso (ad esempio, ricerca con name ma non con state e country) perché il risultato della ricerca della ricerca è ordinato lessicograficamente.

In linea di principio, la vista è indice con alcune funzionalità delle query, non flessibile quanto le query SQL. Vengono eseguiti una volta e memorizzati su disco e calcolati in modo incrementale per i dati nuovi/modificati. Ricorda che è difficile fare cose che sono inefficienti nel sistema distribuito (per cui CouchDB è progettato): join più complicati, ricerca senza indice ... Anche se, in molti casi, la divisione artificiale per le tabelle nel modello relazionale non è necessaria quando è strutturata i documenti sono disponibili e alcuni dei join non sono necessari.

Per un breve confronto tra CouchDB e SQL, vedere il documento this chapter of The Definitive Guide e altri capitoli e lo wiki ufficiale per ulteriori informazioni sulle viste.

+0

Credo che la vera questione è cosa fare quando si dispone di un elevato numero x di campi e non sai quale combinazione di criteri di ricerca l'utente è intenzione di filtrare per. Se si dispone di 20 campi, non è possibile creare le viste 2.432902e + 18 necessarie per gestire tutte le combinazioni di potenziali criteri di ricerca. Puoi avere 20 visualizzazioni e poi provare ad intersecare le viste in qualche modo? –

+0

CouchDB non è un database universale. È necessario progettare la struttura dei dati (schema e viste dei documenti) per casi d'uso specifici. Sebbene siano query multidimensionali e non disponibili senza plug-in aggiuntivi (come GeoCouch o l'utilizzo di lucene/elasticsearch), puoi provare ad evitarlo. La semplice traduzione di SQL alle viste e la mappatura del design relazionale ai documenti JSON non è sufficiente. –

0

È necessario creare una vista che contenga [doc.name, stato doc]. Questo è descritto nella documentazione abbastanza bene. Il vero problema è come selezionare le persone da due stati casuali.

Ecco un buon articolo rispondere a questa domanda: Using Multiple Start and End Keys for CouchDB Views