Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB-计算多个数组的唯一值_Mongodb_Aggregation Framework - Fatal编程技术网

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"]
      }
    }
]
我想得到的是:

  • 每个文档的唯一值的数目。有3个独特的 “x”中的产品值和“y”中的3个唯一值
  • 人数 整体上具有独特的价值观。所有文档都有4个唯一值 收藏中

  • 当您无法或不愿意更改模式时,可以使用

    每个文档的唯一值 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"] }
      ]
    
    在这种情况下,您可以使用聚合管道

  • 用于将值数组转换为唯一文档
  • 与一起使用可在丢弃文档时重新合并文档
  • 再次使用$unwind可再次获取唯一文档流,但这次没有重复文档
  • 使用$group with计算唯一值

  • 谢谢地图还原性能在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"] }
      ]