MongoDB 怎么实现 IN 子查询

MongoDB不直接支持IN子查询,但在处理此类复杂运算时可以借助集算器完成。通过编写集算器脚本并集成到Java应用中,可以实现类似SQL的IN子查询功能,例如查询来自New York的订单。集算器提供了JDBC接口,方便脚本调用和数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB作为 NoSql 的数据库,数据存储就比较随意了,每条记录可拥有不同字段集,但对结构化计算能力方面较弱。比如 MongoDB 不支持子查询,碰到这些复杂的运算就只能先将数据读出后再计算。

比如有两个集合 ORDERS、DEALER,查找来自New York的订单信息,要求 ORDERS 订单中的 SELLERID 必须是 DEALER 集合中 STATE='New York'的销售商 PID。如果写成 sql 就是:
Select * from ORDERS where SELLERID in (select PID from DEALER where STATE='New York')

ORDERSORDERIDCLIENTSELLERIDAMOUNTORDERDATE
30YZ1914600.02019-11-29
31QHHW613800.02019-12-01
32SAVEA95684.02019-12-08
DEALERPIDNAMESURNAMEGENDERSTATEBIRTHDAY
3RebeccaMooreFNew York1974-11-20
4AshleyWilsonFCalifornia1980-07-19
5RachelJohnsonFNew Mexico1970-12-17

使用集算器, 可进行 IN 子查询操作,实现比较容易。
集算器安装包可去润乾网站下载。

我们将上述事例实现步骤:
1.    在集算器中编写脚本 dealer.dfx:

AB
1=mongo_open("mongodb://127.0.0.1:27017/raqdb")/ 连接 MongDB 数据库
2=mongo_shell(A1,"ORDERS.find(,{_id:0})")/ 获取集合 ORDERS 数据
3=mongo_shell(A1,"DEALER.find({STATE:'New   York '},{PID:1, _id:0})").fetch()/ 查询集合 DEALER 中的 PID 数据
4=A3.(PID).sort()/ 取出 PID 并排序
5=A2.select(A4.pos@b(SELLERID)).fetch()/ 查询 SELLERID 存在 PID 中的记录
6>A1.close()/ 关闭连接

  2.      执行脚本返回结果:

A5 ORDERIDCLIENTSELLERIDAMOUNTORDERDATE
31.0QHHW6.013800.02019-12-01
32.0SAVEA9.05684.02019-12-08

A4:A2.join() 中前面 sid, mid 两个为 A2 字段,与 A3 中的两个对应。

集算器提供了 JDBC 接口,脚本 dealer.dfx 很容易集成到 Java 中:
public static void doWork() {

    Connection con = null;
    java.sql.Statement st;
   
    try{
        Class.forName("com.esproc.jdbc.InternalDriver");
        con = DriverManager.getConnection("jdbc:esproc:local://"); 
        // 调用脚本 dealer.dfx
        st=con.createStatement(); 
        ResultSet rst = st.executeQuery("call dealer");
        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);
            }
        }  
    }
}

对 IN、EXISTS、ANY 和 ALL 的查询,都可以借助集算器来实现。
集算器与 JAVA 集成的进一步信息可参考:《Java 如何调用 SPL 脚本》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值