2

我在 couchdb 数据库中有以下文档结构:

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

read数组是已阅读消息的用户 ID 列表。我可以轻松地创建一个视图,以允许我按用户已阅读的消息过滤消息列表,如下所示:

地图功能

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

然后执行查询user_id = 1

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

我的问题是:我将如何编写视图/查询来返回数组中包含用户 ID 的文档read,即“未读”消息。

4

2 回答 2

1

您需要使用一种称为泰式按摩的技术。

上面的链接是我在一封电子邮件中对它的描述,我在 Stack Overflow 上对类似问题的回答中描述了它:Find CouchDB docs missing an absolute field

我认为您需要做的变化是为键发出一个 2 数组,[user_id, doc_id]. 当您查询 user 的“命中”时1234,使用?startkey=[1234,null]&endkey=[1234,{}]仅显示该用户的命中。

于 2012-05-04T09:45:49.390 回答
0

您可以使用以下地图功能,

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

然后执行 user_id = 1 的查询:

curl -X GET \
http://localhost:5984/couchrest/_design/Message/_view/included_in_read?key=1
于 2012-05-04T04:02:16.940 回答