couchdb: recupera documentos para los que no se incluye una identificación en una propiedad de matriz

Tengo la siguiente estructura de documento en una base de datos de couchdb:

{
  'type': 'Message',
  'subject': 'Cheap V1@gr@',
  'body': 'not spam',
  'metadata': {
    'participation': {
      'read': [1,2,3]
    }
  }
}

La read matriz es una lista de ID de usuario que han leído un mensaje. Puedo crear fácilmente una vista que me permita filtrar la lista de mensajes por los mensajes que un usuario ha leído, así:

Función de mapa

function(doc) {
  doc['metadata']['participation']['read'].forEach(function(user_id) {
    emit(user_id, doc._id);
  });
}

y luego para ejecutar la consulta de user_id = 1:

curl -X GET \
  http://localhost:5984/couchrest/_design/Message/_view/included_in_read?key=1

Mi pregunta es: ¿cómo haría para escribir una vista/consulta para devolver documentos para los cuales la identificación del usuario es NO incluido en el read matriz, es decir, mensajes "no leídos".

preguntado el 03 de mayo de 12 a las 18:05

Pequeño consejo: no es necesario que emita el doc._id, porque cada fila tiene un id campo. Utilizando emit(user_id, 1) ahorra espacio en disco y ancho de banda, acelerando las cosas. -

¡Gracias! Noté que la identificación existía en el conjunto de resultados dos veces, ahora entiendo por qué. -

2 Respuestas

Necesitas usar una técnica llamada el masaje tailandés.

El enlace de arriba es mi descripción en un correo electrónico, y lo describí en una respuesta a una pregunta similar en Stack Overflow: Encuentra documentos de CouchDB que faltan en un campo arbitrario

Creo que la variación que tendrías que hacer es emitir una matriz de 2 para la clave, [user_id, doc_id]. Cuando consulta "hits" para el usuario 1234, Utilizar ?startkey=[1234,null]&endkey=[1234,{}] para mostrar solo los resultados de ese usuario.

contestado el 23 de mayo de 17 a las 13:05

Este es un concepto interesante, lo probaré e informaré. - patricio klingemann

Puede utilizar la siguiente función de mapa,

 function(doc) {
   if(!doc.metadata.participation.read)
     emit(doc.user_id, doc);
  }

y luego ejecutar la consulta para user_id = 1:

curl -X GET \
http://localhost:5984/couchrest/_design/Message/_view/included_in_read?key=1

contestado el 04 de mayo de 12 a las 05:05

¿Su solución no emitiría todos los documentos para los cuales la propiedad de lectura es falsa? - patricio klingemann

Prueba una vez y hazme saber el resultado. - Aruna

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.