views - mango - Vistas de CouchDB: elimine los duplicados*y*ordene por tiempo
pouchdb index (2)
Basado en una gran respuesta a mi pregunta anterior , he resuelto parcialmente un problema que estoy teniendo con CouchDB.
Esto resultó en una nueva vista .
Ahora, lo siguiente que tengo que hacer es eliminar los duplicados de esta vista mientras ordeno por fecha.
Por ejemplo, aquí es cómo podría consultar esa vista:
GET http://scoates-test.couchone.com/follow/_design/asset/_view/by_userid_following?endkey=[%22c988a29740241c7d20fc7974be05ec54%22]&startkey=[%22c988a29740241c7d20fc7974be05ec54%22,{}]&descending=true&limit=3
Resultando en esto:
HTTP 200 http://scoates-test.couchone.com/follow/_design/asset/_view/by_userid_following
http://scoates-test.couchone.com > $_.json.rows
[ { id: ''c988a29740241c7d20fc7974be067295''
, key:
[ ''c988a29740241c7d20fc7974be05ec54''
, ''2010-11-26T17:00:00.000Z''
, ''clementine''
]
, value:
{ _id: ''c988a29740241c7d20fc7974be062ee8''
, owner: ''c988a29740241c7d20fc7974be05f67d''
}
}
, { id: ''c988a29740241c7d20fc7974be068278''
, key:
[ ''c988a29740241c7d20fc7974be05ec54''
, ''2010-11-26T15:00:00.000Z''
, ''durian''
]
, value:
{ _id: ''c988a29740241c7d20fc7974be065115''
, owner: ''c988a29740241c7d20fc7974be060bb4''
}
}
, { id: ''c988a29740241c7d20fc7974be068026''
, key:
[ ''c988a29740241c7d20fc7974be05ec54''
, ''2010-11-26T14:00:00.000Z''
, ''clementine''
]
, value:
{ _id: ''c988a29740241c7d20fc7974be063b6d''
, owner: ''c988a29740241c7d20fc7974be05ff71''
}
}
]
Como puede ver, "clementina" aparece dos veces.
Si cambio la vista para emitir el nombre de la fruta / activo como la segunda clave (en lugar de la hora), puedo cambiar la profundidad de la agrupación para contraerlas, pero eso no resuelve mi requisito de orden por tiempo. De manera similar, con la configuración anterior, puedo ordenar por tiempo, pero no puedo colapsar nombres de activos duplicados en filas únicas (para permitir, por ejemplo, 10 activos por página).
Desafortunadamente, esta no es una pregunta simple de explicar. Tal vez esta transcripción de chat ayude un poco.
Por favor ayuda. Me temo que lo que necesito hacer todavía no es posible.
S
Ordenar por un campo y uniquing en otro no es algo que el mapa básico reduzca. Todo lo que puede hacer es ordenar sus datos y aplicar reducir acumulaciones a rangos de claves dinámicas.
Para encontrar la última entrada para cada tipo de fruta, debe consultar una vez por fruta.
Hay algunas maneras de hacer esto que son un poco cuerdas.
Querrá una vista con claves como [fruit_type, date], y luego puede consultar de esta manera:
for fruit in fruits
GET /db/_design/foo/_view/bar?startkey=["apples"]&limit=1&descending=true
Esto le dará la última entrada para cada fruta.
La operación de lista se podría usar para hacer esto, simplemente haría eco de la primera fila del bloque de cada fruta. Esto sería lo suficientemente eficiente siempre que cada fruta tenga un pequeño número de entradas. Una vez que hay muchas entradas por fruta, estará descartando más datos de los que hace eco, por lo que el enfoque de consultas múltiples en realidad se escala mejor que el enfoque de lista, cuando se llega a un conjunto de datos grande. Afortunadamente, ambos pueden trabajar en el mismo índice de vista, por lo que cuando tenga que cambiarlo no será un gran problema.
Puedes hacer esto usando la función de lista. Aquí hay un ejemplo para generar una lista realmente simple que contiene todos los campos de propietario sin engaños. Puede modificarlo fácilmente para producir json o xml o cualquier cosa que desee.
Póngalo en su documento de diseño de activos dentro de las listas.nodupes y use así: http: // admin: [email protected]: 5984 / follow / _design / assets / _list / nodupes / by_userid_following_reduce? Group = true
function(head, req) {
start({
"headers": {
"Content-Type": "text/html"
}
});
var row;
var dupes = [];
while(row = getRow()) {
if (dupes.indexOf(row.key[2]) == -1) {
dupes.push(row.key[2]);
send(row.value[0].owner+"<br>");
}
}
}