使用视图获取与maindomain名称相同的后缀

时间:2016-07-06 01:48:52

标签: mapreduce couchdb

我有一些文档,如何使用视图来获取其电子邮件地址具有相同域名的文档。就像@ gmail.com或@ yahoo.com上的所有文档一样,如果endkey可以获得结果吗?

这是我在地图上写的一个视图,但我不认为这是个好主意

  function(doc) {
    for (var i in doc.emails) {
     if (doc.emails[i].emailAddress.toLowerCase().indexOf("@yahoo.ibm.com")!=-1) {
                    emit(doc.emails[i].emailAddress.toLowerCase(), doc);
                }
            }
        }

    }

2 个答案:

答案 0 :(得分:1)

为了清楚起见,endkey参数不是在寻找后缀。 Startkey和endkey就像获取密钥的限制。例如,您可以将ID为1的文档设为id startkey="1"&endkey="10"

在您的情况下,您希望制作一个视图,按照域名对文档进行分组。我创建了一个带有byDomain视图的设计文档。映射函数如下所示:

    function(doc){
        if(doc.email){ //I used the document's property email for my view.
            //Now, we will emit an array key. The first value will be the domain.
            //To get the domain, we split the string with the character '@' and we take what comes after.
            //Feel free to add more validations
            //The second key will be the document id. We don't emit any values. It's faster to simply add
            //the includes_docs query parameter.
            emit([doc.email.split('@')[1],doc._id]); 
        }
    }
  1. 让我们查询所有文件,向您展示我的内容
  2. 请求:http://localhost:5984/test/_all_docs?include_docs=true 响应:

        {"total_rows":4,"offset":0,"rows":[
        {"id":"7f34ec3b9332ab4e555bfca202000e5f","key":"7f34ec3b9332ab4e555bfca202000e5f","value":{"rev":"1-c84cf3bf33e1d853f99a4a5cb0a4af74"},"doc":{"_id":"7f34ec3b9332ab4e555bfca202000e5f","_rev":"1-c84cf3bf33e1d853f99a4a5cb0a4af74","email":"steve@gmail.com"}},
        {"id":"7f34ec3b9332ab4e555bfca202001101","key":"7f34ec3b9332ab4e555bfca202001101","value":{"rev":"1-53a8a9f2a24d812fe3c98ad0fe020197"},"doc":{"_id":"7f34ec3b9332ab4e555bfca202001101","_rev":"1-53a8a9f2a24d812fe3c98ad0fe020197","email":"foo@example.com"}},
        {"id":"7f34ec3b9332ab4e555bfca202001b02","key":"7f34ec3b9332ab4e555bfca202001b02","value":{"rev":"1-cccec02fe7172fb637ac430f0dd25fa2"},"doc":{"_id":"7f34ec3b9332ab4e555bfca202001b02","_rev":"1-cccec02fe7172fb637ac430f0dd25fa2","email":"bar@gmail.com"}},
        {"id":"_design/emails","key":"_design/emails","value":{"rev":"4-76785063c7dbeec96c495db76a8faded"},"doc":{"_id":"_design/emails","_rev":"4-76785063c7dbeec96c495db76a8faded","views":{"byDomain":{"map":"\t\tfunction(doc){\n\t\t\tif(doc.email){ //I used the document's property email for my view.\n\t\t\t\t//Now, we will emit an array key. The first value will be the domain.\n\t\t\t\t//To get the domain, we split the string with the character '@' and we take what comes after.\n\t\t\t\t//Feel free to add more validations\n\t\t\t\t//The second key will be the document id. We don't emit any values. It's faster to simply add\n\t\t\t\t//the includes_docs query parameter.\n\t\t\t\temit([doc.email.split('@')[1],doc._id]); \n\t\t\t}\n\t\t}"}},"language":"javascript"}}
        ]}
    

    正如您所看到的,我收到了一些简约文档,其中包含“email”设置。

    1. 让我们在没有任何参数的情况下查询我的视图
    2. 请求:http://localhost:5984/test/_design/emails/_view/byDomain

      回应:

      {"total_rows":3,"offset":0,"rows":[
          {"id":"7f34ec3b9332ab4e555bfca202001101","key":["example.com","7f34ec3b9332ab4e555bfca202001101"],"value":null},
          {"id":"7f34ec3b9332ab4e555bfca202000e5f","key":["gmail.com","7f34ec3b9332ab4e555bfca202000e5f"],"value":null},
          {"id":"7f34ec3b9332ab4e555bfca202001b02","key":["gmail.com","7f34ec3b9332ab4e555bfca202001b02"],"value":null}
          ]}
      
      1. 我们只查询具有gmail.com域名的文档。
      2. 请求:http://localhost:5984/test/_design/emails/_view/byDomain?startkey=["gmail.com"]&endkey=["gmail.com","\ufff0"]

        结果:

            {"total_rows":3,"offset":1,"rows":[
                {"id":"7f34ec3b9332ab4e555bfca202000e5f","key":["gmail.com","7f34ec3b9332ab4e555bfca202000e5f"],"value":null},
                {"id":"7f34ec3b9332ab4e555bfca202001b02","key":["gmail.com","7f34ec3b9332ab4e555bfca202001b02"],"value":null}
                ]}  
        

答案 1 :(得分:0)

您可以使用简单的地图功能:

function (doc) {
  var domain = doc.email.split('@').pop();
  // this logic is fairly hack-ish, you may want to be more sophisticated
  emit(domain);
}

然后,您只需传递key=gmail.com即可从视图中获得所需的结果。我还会添加include_docs=true而不是将整个文档作为您的值发布。

您可以在the official CouchDB docs中了解有关观看次数的更多信息。