【问题标题】:couchdb - retrieve documents for which an id is not included in an array propertycouchdb - 检索 id 不包含在数组属性中的文档
【发布时间】:2012-05-03 17:11:38
【问题描述】:

我在 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 数组中的文档,即“未读”消息。

【问题讨论】:

  • 小提示:您不需要发出doc._id,因为每一行都有一个id 字段。使用emit(user_id, 1) 可以节省磁盘空间和带宽,加快速度。
  • 谢谢!我确实注意到 id 在结果集中存在两次,现在我明白为什么了。

标签: couchdb mapreduce


【解决方案1】:

你需要使用一种叫做the Thai massage的技术。

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

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

【讨论】:

  • 这是一个有趣的概念,我会试一试并报告。
【解决方案2】:

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

 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

【讨论】:

  • 您的解决方案不会发出 read 属性为 false 的所有文档吗?
  • 试一次,告诉我结果。
猜你喜欢
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多