Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Javascript 使用Reduce进行MongoDB重复数据消除和排序_Javascript_Mongodb_Aggregation Framework_Reduce - Fatal编程技术网

Javascript 使用Reduce进行MongoDB重复数据消除和排序

Javascript 使用Reduce进行MongoDB重复数据消除和排序,javascript,mongodb,aggregation-framework,reduce,Javascript,Mongodb,Aggregation Framework,Reduce,我正在使用Reduce从数组创建一个字段的连接字符串 例如,假设我有一个子文档的数组,名为子文档——每个子文档都有一个名称字段 e、 g 下面的表达式将给我一个“csv”的“Zak,Bob,Sharon,Zak,Cindy,Bob,Peter,” (是-我知道我可以使用$cond来检测最后一次迭代,并删除跟踪,“” 是否可以使用此reduce进行重复数据消除和排序,以便 “鲍勃、辛迪、彼得、沙龙、扎克” 谢谢! $setUnion从子项.name获取唯一元素,这将按升序对字符串排序 $conca

我正在使用
Reduce
数组
创建一个
字段
的连接
字符串

例如,假设我有一个
子文档的
数组
,名为
子文档
——每个
子文档
都有一个
名称
字段

e、 g

下面的
表达式
将给我一个“csv”的
“Zak,Bob,Sharon,Zak,Cindy,Bob,Peter,”

(是-我知道我可以使用
$cond
来检测最后一次迭代,并删除
跟踪
,“

是否可以使用此
reduce
进行
重复数据消除
排序
,以便

“鲍勃、辛迪、彼得、沙龙、扎克”

谢谢!

  • $setUnion
    子项.name
    获取唯一元素,这将按升序对字符串排序
  • $concat
    将第一个参数作为
    $$value
    传递,如果值为空,则将第二个参数作为条件传递,否则返回空”,“第三个参数作为
    $$this
    表示当前字符串


第二种方法是使用
$substr
而不是
$cond

  • $substr
    要通过当前的reduce操作,reduce操作将返回
    、Bob、Cindy、Peter、Sharon、Zak
  • 现在我们只需要从上面的字符串中删除前2个字符,第二个参数用于从2秒位置开始字符串,第三个参数用于传递字符串的长度-1将返回所有字符串

警告:

根据MongoDB
$setUnion
:输出数组中元素的顺序未指定

但根据我的经验,它以升序返回字符串数组,我也在我的项目中使用过它,我对它进行了各种测试,但它给出了100%的升序

在没有mongodb确认的情况下,您可以选择是否在项目中使用它


在这种情况下,我更喜欢
$cond
而不是
substr
,但我欣赏这两种方法。
$setUnion
似乎是处理
重复数据消除的好方法。我验证了它在您的游乐场中对
asc
进行排序,但您如何知道这一点?声明“`setUnion忽略元素的顺序”并“输出数组中元素的顺序未指定。”我已经更新了它可能对您有帮助的原因。似乎可以处理我的数据。在边缘情况下,这不是最大的问题,因为它失败了,我相信您。谢谢!
[
   {name:"Zak"}, {name:"Bob"}, {name:"Sharon"}, {name:"Zak"}, {name:"Cindy"}, {name:"Bob"}, {name:"Peter"}
]
  uniqueCsv: {
   $reduce: {
     input: "$children",
     initialValue: '',
     in: {
       $concat: ["$$this.name", ", ", "$$value"]
     }
   }
  }
db.collection.aggregate([
  {
    $project: {
      uniqueCsv: {
        $reduce: {
          input: { $setUnion: "$children.name" },
          initialValue: "",
          in: {
            $concat: [
              "$$value",
              { $cond: [{ $eq: ["$$value", ""] }, "", ", "] },
              "$$this"
            ]
          }
        }
      }
    }
  }
])
db.collection.aggregate([
  {
    $project: {
      uniqueCsv: {
        $substr: [
          {
            $reduce: {
              input: { $setUnion: "$children.name" },
              initialValue: "",
              in: {
                $concat: ["$$value", ", ", "$$this"]
              }
            }
          },
          2,
          -1
        ]
      }
    }
  }
])