couchdb-检索数组属性中未包含id的文档

couchdb-检索数组属性中未包含id的文档,couchdb,mapreduce,Couchdb,Mapreduce,我在couchdb数据库中有以下文档结构: { 'type': 'Message', 'subject': 'Cheap V1@gr@', 'body': 'not spam', 'metadata': { 'participation': { 'read': [1,2,3] } } } read数组是已阅读消息的用户ID的列表。我可以轻松创建一个视图,允许我根据用户已阅读的消息筛选消息列表,如下所示: 映射函数 然后执行对用户\u id=1的查

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

{
  'type': 'Message',
  'subject': 'Cheap V1@gr@',
  'body': 'not spam',
  'metadata': {
    'participation': {
      'read': [1,2,3]
    }
  }
}
read
数组是已阅读消息的用户ID的列表。我可以轻松创建一个视图,允许我根据用户已阅读的消息筛选消息列表,如下所示:

映射函数 然后执行对
用户\u id=1
的查询:

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

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

您可以使用以下映射功能

 function(doc) {
   if(!doc.metadata.participation.read)
     emit(doc.user_id, doc);
  }
然后执行用户_id=1的查询:

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

您需要使用一种称为的技术

上面的链接是我在一封电子邮件中对它的描述,我在回答关于堆栈溢出的类似问题时对此进行了描述:


我认为您需要做的变化是为密钥发出一个2数组,
[user\u id,doc\u id]
。当您查询用户
1234
的“点击次数”时,请使用
?startkey=[1234,null]&endkey=[1234,{}]
仅显示该用户的点击次数。

小提示:您不需要发出
文档。\u id
,因为每行都有一个
id
字段。使用
emit(user\u id,1)
可以节省磁盘空间和带宽,加快速度。谢谢!我确实注意到该id在resultset中存在过两次,现在我明白了原因。您的解决方案不会发出read属性为false的所有文档吗?请尝试一次,让我知道结果。这是一个有趣的概念,我将运行它并返回报告。
curl -X GET \
http://localhost:5984/couchrest/_design/Message/_view/included_in_read?key=1