MongoDB 重复数据删除和使用 Reduce 排序

如何解决MongoDB 重复数据删除和使用 Reduce 排序

我正在使用 ReduceString 创建连接的 field array

例如,假设我有一个 arraysubdocuments 名为 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 来检测最后一次迭代并删除 trailing ","

  uniqueCsv: {
   $reduce: {
     input: "$children",initialValue: '',in: {
       $concat: ["$$this.name",","$$value"]
     }
   }
  }

是否可以用这个 dedupe sortreduce 以便我们可以有

"Bob,Zak" ?

谢谢!

解决方法

  • { "data": { "loginUser": { "user": { "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MTgzNjM1NDQsImV4cCI6MTYxODM2NzE0NCwicm9sZXMiOlsiUk9MRV9VU0VSIl0sInVzZXJuYW1lIjoidGVzdDFAdGVzdC5jb20ifQ.pSoAyNcaPa4MH2cxaAM4LJOGvirHfr94GMf_k20eXlF1LAaJyXRraKyC9hmBeKSUeAdIgowlfGFAHt96Z4EruBlkn2mbs3mj3uBWr2zqfNTVyQcicJDkJCO5EpbpexyLO5igD9qZU__4ctPvZcfWY-dJswSfiCTP1Uz0BiGFsGqb72chd8Rhn5Btls-D6b9Uuzl9ZZeLj2pIuBA-yi_CMm3CzopKIJ1NySMT8HyvafHcTdfpzFWFPoUqxkVAzt4U6tqBpEnTqmwRW_3kTisJhIY9xH2uXKghz2VWM6mvTL1PahZgbwLqsVb_sBOOEtiASpGf8WNc1uXtKNhBCb_YJw" } } } } $setUnion 获取唯一元素,这将按升序对字符串进行排序
  • children.name 将第一个参数作为 $concat 传递,第二个作为条件传递,如果值为空则返回空否则“,”,第三个作为 $$value 表示当前字符串
$$this

Playground


第二种方法使用 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

Playground

警告:

根据 MongoDB db.collection.aggregate([ { $project: { uniqueCsv: { $substr: [ { $reduce: { input: { $setUnion: "$children.name" },in: { $concat: ["$$value","$$this"] } } },2,-1 ] } } } ]) :未指定输出数组中元素的顺序。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?