MongoDB-计算多个数组的唯一值
我试图找到一种方法来获取同一文档中以及跨文档的多个数组的唯一值。最好用一个例子来解释:MongoDB-计算多个数组的唯一值,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我试图找到一种方法来获取同一文档中以及跨文档的多个数组的唯一值。最好用一个例子来解释: [ { _id: "x", products: { product_a: ["v1", "v2"], product_b: ["v3", "v2"] } }, { _id: "y", products: { product_a: ["v1"], product_b
[
{
_id: "x",
products: {
product_a: ["v1", "v2"],
product_b: ["v3", "v2"]
}
},
{
_id: "y",
products: {
product_a: ["v1"],
product_b: ["v3", "v4"]
}
}
]
我想得到的是:
当您无法或不愿意更改模式时,可以使用 每个文档的唯一值 map函数将把产品中的所有数组连接成一个数组,删除重复的数组,然后以
\u id
作为键发出该数组的大小。有关如何删除重复项的详细信息,请参见(忽略使用web浏览器javascript库的答案)
整体独特价值观
您可以通过将每个值作为一个键来发出,但其值没有意义
map函数将迭代products对象,然后迭代数组
function mapFunction() {
for (var product in this.products) {
for (var i = 0; i < product.length; i++) {
emit(product[i], null);
}
}
}
结果将是一组文档,其中每个\u id
都是数据中唯一的值之一
何时可以更改模式
当没有充分的理由保持当前模式时,您可以通过将产品
对象转换为数组来简化您的生活:
products: [
{ product: "product_a", values: ["v1", "v2"] },
{ product: "product_b", values: ["v3", "v2"] }
]
在这种情况下,您可以使用聚合管道
谢谢地图还原性能在mongo上非常糟糕。我可能会同意你的第二个选择。为什么要改变模式?如果您知道字段/产品名称,可以使用聚合框架执行此操作。@AsyaKamsky我假设refaelos不止有两个产品。在使用聚合框架时,需要对每个产品名称进行$project。当有几百种以上的产品时,这个查询可能会变得有点笨拙。有几个听起来不像几百种,agg框架比MR快一个数量级,任何编程的东西都不笨拙,在2.6 AF中,可以通过集合轻松处理这些问题。@AsyaKamsky我知道这些产品的名称。您能告诉我如何在不必更改模式的情况下执行此操作吗?如果您知道字段/产品名称,可以使用聚合框架执行此操作。你…吗?
function mapFunction() {
for (var product in this.products) {
for (var i = 0; i < product.length; i++) {
emit(product[i], null);
}
}
}
function reduceFunction(key, values) {
return null;
}
products: [
{ product: "product_a", values: ["v1", "v2"] },
{ product: "product_b", values: ["v3", "v2"] }
]