【问题标题】:Count the number of events attended for a specific user in Cloudant using mapreduce使用 mapreduce 计算 Cloudant 中特定用户参加的事件数
【发布时间】:2017-11-30 01:47:17
【问题描述】:

我正在使用 Cloudant 的 map reduce 功能,并且我想查找具有名称的特定用户(来自用户的输入)在某个日期范围内(来自用户的输入)参加了多少事件(事件对象的计数)。

我的文档如下所示。

{
 user: {
  name: 'peter pan'
 },
 startEventDateTime: <timestamp>,
 endDateDateTime: <timestamp>,
 events: [
  {
    name: 'La la land',
    text: 'more info'
  },
  {
    name: 'La la land',
    text: 'more info'
  }
 ]
}

上面的意思是,用户在开始和结束时间之间参加了 2 个活动。同一用户在不同日期范围内也有许多文档以及参加的活动列表。

如何在 Cloudant map reduce 中实现这一点?

我的尝试: 无法正确获取地图。我可以按名称过滤 地图:

function (doc) {
  emit([doc.user, doc.events, startEventDateTime, endDateDateTime], doc)
}

减少:

function (keys, values, rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length;
  }
}

【问题讨论】:

    标签: javascript mapreduce nosql cloudant


    【解决方案1】:

    我建议为您的文档考虑一种不同的格式。不要让用户文档包含事件列表,而是为每个事件创建一个单独的文档,并在事件发生的时间加上时间戳,例如:

    {
      "_id": "c48ee0881ce7c5d39243d2243d2e63cb",
      "_rev": "1-c2f71fba5f09b129f1db20785f2429b2",
      "user": "bob",
      "datetime": "Thu 30 Nov 2017 09:46:02 GMT",
      "event": {
        "name": "lalaland",
        "text": "more info"
      }
    }
    

    然后您可以依靠 MapReduce 来挑选每个用户的日期范围。这是一个执行此操作的 map 函数:

    function (doc) {
      if (doc && doc.user && doc.datetime) {
        var when = new Date(Date.parse(doc.datetime));
        emit([doc.user, when.getFullYear(), when.getMonth(), when.getDay()], 1);
      }
    }
    

    并使用内置的 reduce _sum。您现在可以使用键范围对数据进行切片。假设您想要用户 bob 在 2017 年 8 月参加的活动:

    curl 'https://ACCT.cloudant.com/DBNAME/_design/DDOC/_view/VIEWNAME?startkey=\["bob", 2017, 7\]&endkey=\["bob", 2017, 8]&group=true&inclusive_end=false&reduce=true'
    
    {
      "rows": [
        {
          "key": [
            "bob",
            2017,
            7,
            4
          ],
          "value": 1
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2014-07-19
      • 2021-02-25
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多