MongoDB 如何查询数组元素的下标

MongoDB通过 $slice 可以按照下标查出内嵌数组的元素,但是不能通过元素的值来查询下标。例如:数组中的元素是存放不同的颜色名称,MongoDB 可以根据数组下标来找颜色,但是不能通过颜色查找对应的下标。

比如:MongoDB 的集合 colors 中,保存了 name 和 color(数组), 数据如下:

colors _id name color

1 page [red,green,blue,white,mauve,black]
2 card [gray,ivory,mauve,lavender,white,black,yellow]

MongoDB 可以查找指定排名的颜色,例如查找 white 的颜色:
db.colors.find({}, {color: {$slice: [3,4]}} ),

虽然能找到颜色 white 的记录,但由于没有提供对应的方法,不能找到 white 在数组中的下标。
使用集算器, 可用 pos() 函数定位数组元素的下标,非常方便。
集算器安装包可去润乾网站下载,运行时需要一个授权,免费版本就够用。

我们将上述描述事例实现步骤:

1.   在集算器中编写脚本 colors.dfx:

A B
1 =mongo_open("mongodb://127.0.0.1:27017/raqdb") / 连接 MongDB 数据库
2 =mongo_shell(A1,"colors.find()").fetch() / 获取集合 colors 数据
3 =A2.new(name:NAME,   color.pos("white"):POS) / 查询 white 在 color 中的下标
4 >A1.close() / 关闭连接
2.   执行脚本返回结果
A3 NAME POS

paper 4
card 5
集算器提供了 JDBC 接口,脚本 colors.dfx 很容易集成到 Java 中:
public static void doColor() {
    Connection con = null;
    java.sql.Statement st;
   
    try{
        Class.forName("com.esproc.jdbc.InternalDriver");
        con = DriverManager.getConnection("jdbc:esproc:local://"); 
// 调用脚本 colors.dfx
st=con.createStatement(); 
ResultSet rst = st.executeQuery("call colors");
        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);
            }
        }  
    }
}

如果想查出当前颜色在数组中所有的下标,可用 pos@a()返回,想了解更多 pos() 用法可参考:《集算器函数参考》。集算器与 JAVA 集成的进一步信息可参考:《Java 如何调用 SPL 脚本》。