2013-01-19 12 views
6

Sto cercando la vista CouchDB JS equivalente della seguente query LINQ:equivalente CouchDB di Sql NOT IN?

var query = 
     from f in context.Feed 
     where !(from ds in context.DataSource 
       select ds.Feed_ID) 
     .Contains(f.ID) 
     select f; 

Dove DataSources hanno una chiave esterna per feed.

In una parola: ottenere tutto non alimenta associato a un DataSource

Grazie

+0

significa 'ottenere tutti Feed non associati a una specifica origine dati 'o' ottieni tutti i feed non associati a ANY DataSource '? – joscas

risposta

2

È possibile utilizzare il view collation di unirsi feed e fonti di dati in mappa:

function(doc) { 
    if (!doc.type) return; 
    if (doc.type == "feed") emit(doc._id, null); 
    if (doc.type == "ds" && doc.feed) emit(doc.feed, null); 
} 

e ridurre al filtra gli ID feed che contengono documenti di origine dati che li collegano. Per esempio. uso del build-in_count e query con group_level:

http://127.0.0.1:5984/test/_design/join/_view/not_in?group_level=1 

per il database:

{"id":"1", "type":"feed"} 
{"id":"2", "type":"feed"} 
{"id":"3", "type":"ds", "feed":1} 
{"id":"4", "type":"ds", "feed":1}} 

vi darà:

{"rows":[ 
{"key":"1","value":3}, 
{"key":"2","value":1} 
]} 

valori >1 sono quei documenti per mangimi che hanno riferimento da fonti di dati . Per ottenere una lista di feed pura senza origini dati è possibile omettere record con value>1 nel client o list function.

Edit: Con la funzione elenco:

function(head, req) { 
    var row; 
    while (row = getRow()) { 
    if (row.value == 1) 
     send(row.key + "\n"); 
    } 
} 

e query:

http://127.0.0.1:5984/test/_design/join/_list/not_ds/not_in?group_level=1 

Si otterrà il risultato finale con i documenti di alimentazione con riferimento fuori da fonti di dati. È un testo di lamentela con un elenco di ID, puoi anche formattarlo per l'array JSON.

0

La risposta diretta a equivalente a CouchDB di Sql NON IN è: Non esiste un equivalente. Non è disponibile l'opzione di query nello couchdb view API per NON IN.

Tuttavia, ci possono essere modi alternativi per raggiungere i vostri obiettivi a seconda se siete interessati a ottenere feed associati a nessuna origine dati o non associate a una specifica origine dati.

0

So che questo è un vecchio post, ma avendo affrontato lo stesso problema penso che la risposta di Marcin sia corretta ma incompleta.

Nel mio caso ho usato la seguente funzione elenco per selezionare ottenere tutte le righe ad eccezione di quelli con una certa excludeId:

function(head, req) { 
start({ 'headers': { 'Content-Type': 'application/json' } }); 
var rows = []; 
while (row = getRow()) { 
    if (!req.query.exceptId || doc.documentId != req.query.exceptId) { 
     rows.push(row); 
    } 
} 
send(JSON.stringify({ total_rows: rows.length, rows: rows })); 
} 

si può leggere di più here