MongoDB 如何查询嵌套子文档

MongoDB中的嵌套子文档查询是个常见需求,但直接使用find()可能无法达到预期效果。正确做法通常涉及aggregate、$project、$filter等操作。本文介绍了如何通过集算器的select()查询来简化这一过程,实现对'category=food'子文档的过滤。同时,集算器提供JDBC接口,方便与Java集成。

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

MongoDB作为 NoSql 的数据库,能通过嵌套子文档,将横向扩展以及性能做到更好,实现一对多的关联关系。应用开发中,对嵌套子文档结构的查询,不熟悉者 MongoDB 也容易陷入误区。如有如下数据

……
{ "_id": "1001", "name": "Storage Beta", "items": [ { "category": "food", "name": "pear" }, { "category": "food", "name": "peach" }, { "category": "food", "name": "grape"}, { "category": "tool", "name": "knife"}, { "category": "furniture", "name": "chair" }, { "category": "furniture", "name": "bench"} ]} ……

查询 category='food' 的子文档,估计不少使用者首先想到用 find() 语句查询:

db.storage.find({'items.category':{ $eq: 'food'}}).pretty();
则返回上面所有的数据,并没有达到过滤数据的目的。MongoDB实现方式确实有点与众不同,需要采用aggregate+$project+$filter+input+cond的组合查询,实现细节就不再赘述。

使用集算器, 可进行 select() 查询操作,实现比较容易。

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

AB
1=mongo_open("mongodb://127.0.0.1:27017/raqdb")/ 连接 MongDB 数据库
2=mongo_shell(A1,"storage.find()").fetch()/ 获取集合 storage 数据
3=A2.new(_id, name, items.select(category=="food"):items )/ 过滤查询数据,将结果集存入序表
4>A1.close()/ 关闭连接

2. 执行脚本返回结果A3:

_idnameitems
1000Storage Alpha[[food,apple],[food,banana]]
1001Storage Beta[[food,pear],[food,peach],[food,grape]]

集算器提供了 JDBC 接口,脚本 storage.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://");  
        // 调用脚本 storage.dfx
        st=con.createStatement();  
        ResultSet rst = st.executeQuery("call storage");
        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 脚本》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值