从CouchDB中的所有文档中聚合一组唯一值

问题描述 投票:0回答:1

我正在尝试在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"]
}

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

couchdb aggregate
1个回答
0
投票

我要亲自回答。

首先,我们要定义一个映射函数,该函数将组名作为键并将值包装在数组中(使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”] ||颜色| [“红色”,“白色”,“蓝色”,“绿色”] |+ ------------ + ----------------------------------- +
© www.soinside.com 2019 - 2024. All rights reserved.