如何解决MongoDB 重复数据删除和使用 Reduce 排序
我正在使用 Reduce
从 String
创建连接的 field
array
。
例如,假设我有一个 array
的 subdocuments
名为 children
- 每个 child
都有一个 name
field
。
例如
[
{name:"Zak"},{name:"Bob"},{name:"Sharon"},{name:"Zak"},{name:"Cindy"},{name:"Peter"}
]
下面的 expression
会给我一个 "Zak,Bob,Sharon,Zak,Cindy,Peter,"
的“csv”;
(是的 - 我知道我可以使用 $cond
来检测最后一次迭代并删除 trail
ing ","
。
uniqueCsv: {
$reduce: {
input: "$children",initialValue: '',in: {
$concat: ["$$this.name",","$$value"]
}
}
}
是否可以用这个 dedupe
sort
和 reduce
以便我们可以有
"Bob,Zak"
?
谢谢!
解决方法
-
{ "data": { "loginUser": { "user": { "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MTgzNjM1NDQsImV4cCI6MTYxODM2NzE0NCwicm9sZXMiOlsiUk9MRV9VU0VSIl0sInVzZXJuYW1lIjoidGVzdDFAdGVzdC5jb20ifQ.pSoAyNcaPa4MH2cxaAM4LJOGvirHfr94GMf_k20eXlF1LAaJyXRraKyC9hmBeKSUeAdIgowlfGFAHt96Z4EruBlkn2mbs3mj3uBWr2zqfNTVyQcicJDkJCO5EpbpexyLO5igD9qZU__4ctPvZcfWY-dJswSfiCTP1Uz0BiGFsGqb72chd8Rhn5Btls-D6b9Uuzl9ZZeLj2pIuBA-yi_CMm3CzopKIJ1NySMT8HyvafHcTdfpzFWFPoUqxkVAzt4U6tqBpEnTqmwRW_3kTisJhIY9xH2uXKghz2VWM6mvTL1PahZgbwLqsVb_sBOOEtiASpGf8WNc1uXtKNhBCb_YJw" } } } }
从$setUnion
获取唯一元素,这将按升序对字符串进行排序 -
children.name
将第一个参数作为$concat
传递,第二个作为条件传递,如果值为空则返回空否则“,”,第三个作为$$value
表示当前字符串
$$this
第二种方法使用 db.collection.aggregate([
{
$project: {
uniqueCsv: {
$reduce: {
input: { $setUnion: "$children.name" },initialValue: "",in: {
$concat: [
"$$value",{ $cond: [{ $eq: ["$$value",""] },"",","] },"$$this"
]
}
}
}
}
}
])
而不是 $substr
-
$cond
传递当前的reduce 操作,reduce 操作将返回$substr
- 现在我们只需要从上面的字符串中删除前 2 个字符,从第二个位置开始字符串的第二个参数和传递字符串长度 -1 的第三个参数将返回所有字符串
,Bob,Cindy,Peter,Sharon,Zak
警告:
根据 MongoDB db.collection.aggregate([
{
$project: {
uniqueCsv: {
$substr: [
{
$reduce: {
input: { $setUnion: "$children.name" },in: {
$concat: ["$$value","$$this"]
}
}
},2,-1
]
}
}
}
])
:未指定输出数组中元素的顺序。
但根据我的经验,它按升序返回字符串数组,我也在我的项目中使用过它,我已经对它进行了各种测试,但它给出了 100% 的升序。
在没有 mongodb 确认的情况下,您可以选择是否在您的项目中使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。