Vista de Pouchdb que devuelve un resultado vacío

Vista de Pouchdb que devuelve un resultado vacío

Buenos días, Actualmente estoy trabajando con Couchdb y Pouchdb y tengo un problema con una consulta en el lado de Pouchdb.

Tengo una base de datos con diferentes documentos configurados así:

{
  "_id": "fd87b66087503d760fa501fa49029f94",
  "_rev": "1-e2be19d447c98d624c2c8492eaf0a3f4",
  "type": "product",
  "name": "Blanc de Morgex et de la Salle Brut Extreme 2014",
  "category": "Wine",
  "subcategory": null,
  "zone": "Italy",
  "nation": "Valle d'Aosta",
  "province": "Morgex, AO",
  "cellar": "Cave Mont Blanc",
  "price": 30,
  "structure": null,
  "year": 2014,
  "mescita": null,
  "tag": null
}

La consulta que escribí debería devolver los años disponibles de productos que coinciden con algunos filtros. Esta es la consulta, con reduce : _count:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year != null) {
        emit(doc.year , 1);
    }
}

Si lo pruebo con Postman agregando el parámetro group = true todo funciona y el resultado es algo como:

{
    "rows": [
        {
            "key": 2004,
            "value": 2
        },
        {
            "key": 2006,
            "value": 2
        },
        {
            "key": 2008,
            "value": 2
        }
    ]
}

El problema es cuando ejecuto esta vista con Pouchdb con el siguiente código que devuelve un JSON con una matriz vacía:

wine_db.query('wine_list/years', {reduce: '_count', key : "Bollicine", group : true, group_level: 2}).then(function(doc) {
    years_list = doc;
    console.log('getting year list');
    console.log(doc);
}).catch(function(err){
    console.log(err);
});

He intentado jugar un poco con los parámetros de la función e incluso cambiar la función para que devuelva solo una lista de todos los años, pero no. No puedo encontrar el problema ni una solución diferente, así que estoy abierto a cualquier sugerencia que puedas tener.


Otra solución (resultado del grupo)

Trabajando en las indicaciones y en la solución sugerida por @user3405291 finalmente encontré una manera de agrupar los resultados por año. Dado que la función de emisión devuelve una clave compleja ['CATEGORY', YEAR], puedo usar los parámetros startkey y endkey para consultar el resultado solo para una sección del índice devuelto manteniendo de esta manera la función de reducción habilitada para agrupar el resultado.

Al final la función de vista es:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit([doc.category, doc.year], doc.year );
    }
}

Y la consulta de Pouchdb:

wine_db.query('wine_list/years', 
    {
        startkey : ['CATEGORY'],
        endkey : ['CATEGORY', {}],
        group: true
    }
).then(function (doc) {
    years_list = doc;
    console.log(years_list);
}).catch(function (err) {
    console.log(err);
}); 

El resultado, donde valor es el número total de elementos con ese índice:

{
    "rows": [
        {
            "key": [
                "Bollicine",
                2004
            ],
            "value": 2
        },
        {
            "key": [
                "Bollicine",
                2006
            ],
            "value": 2
        },
        {
            "key": [
                "Bollicine",
                2008
            ],
            "value": 2
        }
    ]
}
Mostrar la mejor respuesta

En su función de mapa de vista, emit el año como clave/índice:

emit(doc.year , 1);

Ahora, no estoy seguro de por qué estás haciendo tu consulta con una clave como {key : "Bollicine"}:

wine_db.query('wine_list/years', {key : "Bollicine"})
.then(res=>{console.log(res)})

Por supuesto, obtendrá una respuesta vacía, porque su vista en realidad está indexando sus documentos de acuerdo con year. Creo que es posible que desee hacer una consulta con una clave como: {key : "2014"}


ACTUALIZAR

Según sus comentarios, siento que necesita encontrar documentos basados ​​en year y category. No estoy seguro de entender lo que quieres, pero esto puede ayudarte: cambia la función de vista de mapa de esta manera:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit([doc.year, doc.category] , 1);
    }
}

La vista anterior indexará tus documentos según el año y la categoría. Luego consulta su vista de esta manera:

wine_db.query('wine_list/years', {key : ['2014', 'Bollicine']})
.then(res=>{console.log(res)})

La consulta anterior le dará todos los documentos con el campo year igual a 2014 y el campo category igual a Bollicine.


Segunda actualización

su código funciona, pero acabo de obtener el resultado del año 2014. Lo que estoy tratando de lograr es obtener todos los años disponibles en una categoría específica

Una solución es esta:

function (doc) {
    if(doc.category && doc.type == 'product' && doc.year) {
        emit(doc.category, doc.year);
    }
}

La vista anterior indexará sus documentos según la categoría como clave y devolverá el año como valor. Por lo tanto, puede consultar de esta manera:

wine_db.query('wine_list/years', {key : 'Bollicine'})
.then(res=>{console.log(res)})

Deberías obtener una respuesta como esta, por la cual tienes todos los años disponibles para la categoría Bollicine:

{
    "total_rows": 400,
    "offset": 0,
    "rows": [
        {
            "key": "Bollicine",
            "value": "2014"
        },

        {
            "key": "Bollicine",
            "value": "2015"
        },

        {
            "key": "Bollicine",
            "value": "2018"
        }

    ]
}

¡Hola! Estoy haciendo una consulta con una clave como Bollicine porque necesito obtener todos los años disponibles para esa categoría. El uso de una clave con un año me obligará a cambiar la declaración condicional con algo como: if(doc.type == 'product' && doc.year != null && doc.year) {... Devolviendo así solo el año 2014, por ejemplo.

Por cierto, su respuesta me puso en el camino correcto, parece que estoy usando el parámetro clave de manera incorrecta. Debería escribir category : 'Bollicine', no key: 'Bollicine'. Veamos si funciona.

sí, su código funciona, pero acabo de obtener el resultado del año 2014. Lo que estoy tratando de lograr es obtener todos los años disponibles en una categoría específica =/

Ok, estoy empezando a entenderlo. Muchas gracias por la ayuda. Aprendí algo nuevo sobre índices y funciones reducidas. ¡Gracias de nuevo!