困难的couchdb查询

时间:2011-12-29 14:05:55

标签: ruby-on-rails couchdb couchrest

我有以下查询:

view.reduce.group_level(5).keys

返回:

[["1f9c79a33f399a7937d880c5f31e8dbc", 2011, 12, 29, 13], ["1f9c79a33f399a7937d880c5f31e8dbc", 2011, 12, 29, 14], ["c38332ffc275b6c70bcf06ffc39ddbdd", 2011, 12, 29, 13], ["c38332ffc275b6c70bcf06ffc39ddbdd", 2011, 12, 29, 14]]

第一个键是id,其他键是年,月,日,小时

我想要2010年到2013年之间的所有行。所以我想忽略第一个键。

问题是我需要设置第一个参数来获得结果,但我想获得所有键的所有结果。

例如:view.reduce.group_level(5).startkey(["every_possible_key", 2010]).endkey(['every_possible_key", 2013, {}])

如果我把第一把钥匙留空,那么我什么也得不到。如果我给它“\ u9999”而不是我得到的所有东西,它忽略了第二把钥匙。

有人知道我做错了什么吗?

非常感谢。

图:

function(d) {
    if (d['type'] == 'State' && d['driver_id'] && d['name'] && d['created_at']) {
      var dt = new Date(d.created_at);
      emit([d.driver_id, dt.getFullYear(), dt.getMonth() + 1, dt.getDate(), dt.getHours()], d.name);
    }
  }

减少

function(k,v,r) {
    var result = {
      'hire': 0, 'hired': 0, 'arrived': 0, 'pick up': 0, 'drop off': 0,
      'missed': 0, 'rider cancel': 0, 'driver cancel': 0, 'no show': 0,
      'avail': 0, 'unavail': 0, 'other': 0
    };
    if (r) {
      var row = null;
      for (i in v) {
        row = v[i];
        for (j in row) {
          result[j] += row[j];
        }
      }
    } else {
      for (i in v) {
        if (result[v[i]] != null) {
          result[v[i]] += 1;
        } else {
          result['other'] += 1;
        }
      }
    }

    return result;
  }

1 个答案:

答案 0 :(得分:1)

您“做错了”的方法是使用查询中不需要的密钥作为视图的第一个键。

如果您需要其他查询,请创建另一个视图。