【问题标题】:Aggregate a set of unique values from all documents in CouchDB从 CouchDB 中的所有文档中聚合一组唯一值
【发布时间】:2019-09-30 14:26:32
【问题描述】:

我正在尝试在 CouchDB 中创建一个返回唯一值组的视图。例如,所有独特品牌和类别的列表。

地图功能

function (doc) {
  emit("brands", [doc.brand]);
  emit("categories", [doc.category]);
}

归约函数

function (keys, values, rereduce) {
  return values.reduce(function(acc, value) {
    if (acc.indexOf(value[0]) === -1) {
      return acc.concat(value);
    }

    return acc;
  });
}

然后我用group=truegroup_level=2 调用该视图。分组是正确的,但值不是唯一的。 value 是一个包含重复项的数组。

我想要实现的基本上是让key 成为组名,例如brands,值是聚合的唯一值,例如["Brand A", "Brand B"]

鉴于以下文件

[
  {
    "_id": "1",
    "brand": "Brand A",
    "category": "Category A",
    "colors": [
      "Red",
      "White"
    ]
  },
    {
    "_id": "2",
    "brand": "Brand B",
    "category": "Category B",
    "colors": [
      "Blue",
      "White"
    ]
  },
    {
    "_id": "3",
    "brand": "Brand A",
    "category": "Category B",
    "colors": [
      "Green",
      "Red"
    ]
  }
]

当我在 CouchDB 中查询然后查看时,我希望得到以下结果

{
  "brands": ["Brand A", "Brand B"],
  "categories": ["Category A", "Category B"],
  "colors": ["Red", "White", "Blue", "Green"]
}

注意:上面的结果只是我期望视图返回的演示。它不必如此构造(甚至不确定是否可能)。

【问题讨论】:

  • 请出示您当前的代码。不工作怎么办?
  • @Flimzy 我现在添加了一个用于检索一个属性的唯一值的示例。
  • 相关的reduce函数在哪里?
  • 我现在已经用我的 map 和 reduce 函数更新了这个问题。我已经说明了哪些有效,哪些无效。我还提供了一个我尝试实现的示例。

标签: couchdb aggregate


【解决方案1】:

我自己来回答。

首先,我们要定义一个映射函数,它发出组名作为键,值封装在一个数组中(使rereduce 更容易)。

地图功能

function (doc) {
  emit("brands", [doc.brand]);
  emit("categories", [doc.category]);
  doc.colors.forEach(function(color) {
    emit("colors", [color]);
  })
}

我们定义了一个自定义的reduce函数

function (keys, values, rereduce) {
  return values.reduce(function(acc, value) {
    value.forEach(function(v) {
      if (acc.indexOf(v) === -1) {
        return acc.push(v);
      }
    });

    return acc;
  });
}

现在,使用group=truegroup_level=1 调用视图将产生以下结果:

+------------+------------------------------------------------+ |关键 |价值 | +------------+------------------------------------------------+ |品牌 | [“品牌 A”、“品牌 B”] | |类别 | [“A 类”、“B 类”] | |颜色 | [“红”、“白”、“蓝”、“绿”] | +------------+------------------------------------------------+

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2017-08-16
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2021-08-30
    • 2012-07-02
    相关资源
    最近更新 更多