M2M在CouchDB中与非主键链接

时间:2012-02-22 12:33:07

标签: couchdb

我有一堆"会议"文件和一堆用户"文档。一个 用户可能有多个电子邮件,会议可能在多个之间 通过电子邮件识别的人。

我需要通过会议ID和用户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"}
}

这是可能的吗?我有一种可怕的感觉,我会去 加载查询来执行此操作:(

2 个答案:

答案 0 :(得分:0)

你可以写一个像

这样的地图
"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已加入两次会议)

反之亦然(对于用户而言)

function(doc) {
  if(doc.type=="user") {
    for (var curEmail in doc.emails) {
      emit (doc.emails[curEmail],null);
    }
  }
}

电话

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

结果:

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

答案 1 :(得分:0)

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