如何使用Map-Reduce进行基于组的过滤?

时间:2017-10-02 07:20:20

标签: javascript mongodb mapreduce couchdb cloudant

我对这个map-reduce的事情很陌生,我正在使用它来过滤掉我网站上的用户。

我想问的是如何在其中进行基于群组的过滤?

让我向您解释一下这个场景: - 我想过滤掉用户在特定日期之间询问的问题,例如>从: - 01/01/2016到: - 03/02/2016。

我通过运行MR函数得到下面给出的数据我还想在Cloudant上再次运行Reduce函数,以便我可以在特定日期之间进行查询

我正在使用Cloudant,Mongodb,Couchdb和JavaScript。

感谢您的回复,并将宝贵的时间用于阅读我的查询。很抱歉,如果您对查询有所了解,我会对此感到陌生。

1 个答案:

答案 0 :(得分:0)

如果查询中的日期是在运行时动态提供的,那么视图可能不是正确的方法。您可以使用Cloudant Query在运行时运行动态查询。例如,您可以在日期字段上创建索引,如下所示:

{
  "index": {
    "fields": [
      "mydate"
    ]
  },
  "type": "json"
}

然后在Cloudant查询中使用以下选择器:

"selector": {
   "$and": [
      {"mydate" : { "$gt": 1506874127 }},
      {"mydate": { "$lt": 1506960651 }}
   ]
}

我在这个例子中使用unix时间戳。

或者,您可以使用Cloudant Search。在Cloudant中创建类似于以下内容的搜索索引:

{
  "_id": "_design/allDocs",
  "views": {},
  "language": "javascript",
  "indexes": {
    "byMyDate": {
      "analyzer": "standard",
      "index": "function (doc) {\n  if (doc.mydate) {\n    index(\"mydate\", doc.mydate);\n  }\n}"
    }
  }
}

使用Cloudant仪表板时,这与以下内容相对应:

设计doc = allDocs

索引名称= byMyDate

index function =

function (doc) {
  if (doc.mydate) {
    index("mydate", doc.mydate);
  }
}

然后您可以使用范围运行搜索。例如,

https://<YOUR_INSTANCE>.cloudant.com/<YOUR_DB>/_design/allDocs/_search/byMyDate?q=mydate%3A[1506874127%20TO%201506960651]

此处搜索查询为:

mydate:[1506874127 TO 1506960651]

同样,我使用的是unix时间戳。你也可以使用我相信的日期字符串。

Cloudant查询:https://console.bluemix.net/docs/services/Cloudant/api/cloudant_query.html

Cloudant搜索:https://console.bluemix.net/docs/services/Cloudant/api/search.html#search