MongoDB 如何查找某数组字段与指定集合有交集的记录
从指定的数组中查找符合条件的记录,查找某一列数组型数据与指定的数组存在交集的数据。
比如:所给课程的数组为[English, History, Math],从集合 students中查询至少选修其中一门课程的学生信息
students | _id | name | lesson |
1.0 | Mark | [English,Chemical,Math,Physics] | |
2.0 | Tom | [Chinese,Chemical,Math,Biology] | |
3.0 | Scott | [Chinese,History] | |
4.0 | Andy | [Chinese,Chemical,Politics,Physics] |
用 MongoDB 脚本实现思路,可采用 filter+input+cond+$in 组合进行过滤得到 lesson 交集,再去掉 lessons 为空的记录,最后列过滤显示,实现过程比较麻烦。
使用集算器, 可用求交集的方式来实现。
集算器安装包可去润乾网站下载,运行时需要一个授权,免费版本就够用。
我们将上述描述事例实现步骤:
1. 在集算器中编写脚本 lesson.dfx:
A | B | |
1 | [English, History, Math] | / 查询条件科目数组 |
2 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") | / 连接 MongDB 数据库 |
3 | =mongo_shell(A2,"students.find()").fetch() | / 获取集合 students 数据 |
4 | =A3.new(_id, name, lesson^A1:lesson).select(lesson!=[]) | / 将交集存于 lesson 字段,并去掉空集记录 |
5 | >A2.close() | / 关闭连接 |
A5 | _id | name | lesson |
1.0 | Mark | [English,Math] | |
2.0 | Tom | [Math] | |
3.0 | Scott | [History] |
集算器提供了 JDBC 接口,脚本 lesson.dfx 很容易集成到 Java 中:
public static void doLesson() {
Connection con = null;
java.sql.Statement st;
try{
Class.forName("com.esproc.jdbc.InternalDriver");
con = DriverManager.getConnection("jdbc:esproc:local://");
// 调用脚本 lesson.dfx
st=con.createStatement();
ResultSet rst = st.executeQuery("call lesson");
System.out.println(rst);
}catch(Exception e){
System.out.println(e);
}finally{
// 关闭连接
if (con!=null) {
try {
con.close();
}catch(Exception e) {
System.out.println(e);
}
}
}
}
集算器与 JAVA 集成的进一步信息可参考:《Java 如何调用 SPL 脚本》。
英文版