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
]
}
}
}
])