CouchDB中具有非主键的M2M链接

CouchDB中具有非主键的M2M链接,couchdb,Couchdb,我有一堆“会议”文档和一堆“用户”文档。A. 用户可能有多封电子邮件,并且一次会议可能在多封电子邮件之间进行 通过电子邮件识别的人 我需要通过会议ID查找用户,并通过 电子邮件 我的文档现在看起来像这样: { "type": "meeting" "_id": "MEETINGID", "emails": ["test1@example.com", "test2@example.com"] // Lots of others things } { "type": "user"

我有一堆“会议”文档和一堆“用户”文档。A. 用户可能有多封电子邮件,并且一次会议可能在多封电子邮件之间进行 通过电子邮件识别的人

我需要通过会议ID查找用户,并通过 电子邮件

我的文档现在看起来像这样:

{
  "type": "meeting"
  "_id": "MEETINGID",
  "emails": ["test1@example.com", "test2@example.com"]
  // Lots of others things
}

{
  "type": "user",
  "_id": "USERID",
  "emails": ["a@example.com", "test1@example.com"]
  // Lots of others things
}
我需要通过电子邮件与他们保持联系

但如果有帮助的话,我当然可以这样把它们分开:

{
  "type": "user",
  "_id": "USERID",
  // Lots of others things
}

{
  "type": "user-email",
  "_id": "USERID",
  "email": "a@example.com"
}

{
  "type": "user-email",
  "_id": "USERID",
  "email": "test1@example.com"
}
我需要生成如下内容的视图:

{
  "key": "MEETING",
  "document": {"_id": "USERID"}
}


{
  "key": "USERID",
  "document": {"_id": "MEETINGID"}
}
这可能吗?我有一种可怕的感觉,我要
正在加载查询以完成此操作:(

您可以像

"meetingByEmail": 
  function (doc) {
    if(doc.type=="meeting") {
      for (var curEmail in doc.emails) {
        emit (doc.emails[curEmail],null);
      }
    }
  }
电话:

 _view/byEmail?key="test1@example.com":
结果:

{"total_rows":4,"offset":0,"rows":[
{"id":"f2338c8e69d1da02c94a2104b6000e77","key":"test1@example.com","value":null},
{"id":"f2338c8e69d1da02c94a2104b6000e88","key":"test1@example.com","value":null}
]}
(f2338c8e69d1da02c94a2104b6000e77是来自一个会议的ID,用户test1参加了两个会议)

反之亦然(适用于用户)

电话

user/_view/byEmail?key="test1@example.com"
结果:

{"total_rows":2,"offset":1,"rows":[
{"id":"user1","key":"test1@example.com","value":null}
]}

简单的答案是“你不能”不幸的是,CouchDB不允许这样的东西。

谢谢你的回答!不幸的是,虽然这让我可以通过电子邮件检索会议或用户,但这无助于通过用户id或用户id检索会议。我现在的解决方案使用了你在这里提出的建议,并涉及到对每个地址的单独查询,这并不好。好的,在这种情况下,您必须使用{userId:..,email:}]字段将“emails[”更改为“user[”,如果用户更改了他(她)的电子邮件,则使用该用户id查询所有会议并更改用户数据。使用该设置,您可以编写一个包含两个emit..user.id和user.email..的视图,然后您将收到会议。第二个(逐个会议的用户)很简单。只需获取meetingID,就可以拥有所有用户。但这并不是我想要的语义。这两种类型都可以独立存在,所以会议可以存在于不在用户中的电子邮件中,反之亦然。链接也应该位于电子邮件字段中,所以若和文档相关联的电子邮件列表发生更改,则会发生更改我知道我可以通过运行进程来做到这一点,在任何事情发生变化时检查并修补一切,但这似乎是一种非常脆弱的方式。
{"total_rows":2,"offset":1,"rows":[
{"id":"user1","key":"test1@example.com","value":null}
]}