join - CouchDB equivalente de Sql NO EN?
contains notin (3)
La respuesta directa al equivalente de CouchDB de Sql NOT IN es: No hay equivalente. No hay opción de consulta en la API de visualización de couchdb para NOT IN .
Sin embargo, puede haber formas alternativas de lograr sus objetivos dependiendo de si está interesado en recibir feeds asociados a fuentes de datos o no asociados a un origen de datos específico .
Estoy buscando la vista CouchDB JS equivalente de la siguiente consulta LinQ:
var query =
from f in context.Feed
where !(from ds in context.DataSource
select ds.Feed_ID)
.Contains(f.ID)
select f;
Donde DataSources tiene una clave externa para Feeds.
En una palabra: obtenga todos los Feeds no asociados con un DataSource
Gracias
Puede usar la intercalación de vistas para unir feeds y orígenes de datos en el mapa:
function(doc) {
if (!doc.type) return;
if (doc.type == "feed") emit(doc._id, null);
if (doc.type == "ds" && doc.feed) emit(doc.feed, null);
}
y reduzca para filtrar los identificadores de alimentación que tienen documentos fuente de datos que se vinculan a ellos. P.ej. uso del build-in _count
y query con group_level :
http://127.0.0.1:5984/test/_design/join/_view/not_in?group_level=1
para la base de datos:
{"id":"1", "type":"feed"}
{"id":"2", "type":"feed"}
{"id":"3", "type":"ds", "feed":1}
{"id":"4", "type":"ds", "feed":1}}
Te regalaré:
{"rows":[
{"key":"1","value":3},
{"key":"2","value":1}
]}
Los valores >1
son aquellos documentos de feed que tienen referencia de fuentes de datos. Para obtener la lista de fuentes puras sin fuentes de datos, puede omitir registros con value>1
en la función de cliente o lista .
Editar: con la función de lista:
function(head, req) {
var row;
while (row = getRow()) {
if (row.value == 1)
send(row.key + "/n");
}
}
y consulta:
http://127.0.0.1:5984/test/_design/join/_list/not_ds/not_in?group_level=1
Obtendrá el resultado final con documentos de alimentación sin referencia de fuentes de datos. Es un texto de reclamo con una lista de identificadores, también puedes formatearlo para la matriz JSON.
Sé que esta es una publicación anterior, pero habiéndome enfrentado al mismo problema, creo que la respuesta de Marcin es correcta pero incompleta.
En mi caso, utilicé la siguiente función de lista para seleccionar obtener todas las filas excepto las que tienen un cierto 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 }));
}
puedes leer más aquí