【mongodb基础-6】mongodb query in java

本文主要介绍mongodb查询的语法,这里包括基础查询语法:例如等于、包含、and、or基础的sql操作;数组查询、嵌套文档查询、以及如何遍历他们。

零. 准备工作

引入maven依赖


    org.mongodb
    mongodb-driver-sync
    4.8.2

创建mongodb client与连接一个collection:

static MongoClient mongoClient = MongoClients.create();
static MongoCollection collection = mongoClient.getDatabase("flink_dev")
            .getCollection("test");
本文连接的mongodb采用本机安装的mongodb。

创建一些测试数据:

    public static void insertMany() {
        collection.insertMany(asList(
                Document.parse("{ item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' }"),
                Document.parse("{ item: 'notebook', qty: 50, size: { h: 8.5, w: 11, uom: 'in' }, status: 'A' }"),
                Document.parse("{ item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, status: 'D' }"),
                Document.parse("{ item: 'planner', qty: 75, size: { h: 22.85, w: 30, uom: 'cm' }, status: 'D' }"),
                Document.parse("{ item: 'postcard', qty: 45, size: { h: 10, w: 15.25, uom: 'cm' }, status: 'A' }")
        ));
    }

创建一个遍历的方法

    private static void traversalDocument(FindIterable cursor) {
        try (final MongoCursor cursorIterator = cursor.cursor()) {
            while (cursorIterator.hasNext()) {
                System.out.println(cursorIterator.next());
            }
        }
    }

json转换为查询Bson的方法,这里可以将mongo shell的一些查询条件 转换为bson,更加方便用户理解和使用mongo的查询。

    private static Bson parseFilter(String str) {
        if (StringUtils.isNotEmpty(str)) {
            return BasicDBObject.parse(str);
        }
        return null;
    }

一. 基础查询语法

  1. 等于

//SELECT * FROM inventory WHERE status = "D"
FindIterable cursor = collection.find(parseFilter("{ status: \"D\" }"));

展示:

Document{{_id=641963756d7f06601ea0104f, item=paper, qty=100, size=Document{{h=8.5, w=11, uom=in}}, status=D}}
Document{{_id=641963756d7f06601ea01050, item=planner, qty=75, size=Document{{h=22.85, w=30, uom=cm}}, status=D}}
Document{{_id=641963897da95209d3b0d474, item=paper, qty=100, size=Document{{h=8.5, w=11, uom=in}}, status=D}}
Document{{_id=641963897da95209d3b0d475, item=planner, qty=75, size=Document{{h=22.85, w=30, uom=cm}}, status=D}}
Document{{_id=641964f5207e1045878c327d, item=paper, qty=100, size=Document{{h=8.5, w=11, uom=in}}, status=D}}
Document{{_id=641964f5207e1045878c327e, item=planner, qty=75, size=Document{{h=22.85, w=30, uom=cm}}, status=D}}

不想展示冗长的_id,即按照我们自己的意愿来展示想要的字段。来这样设置:

参考: Getting Started with MongoDB and Java - CRUD Operations Tutorial
FindIterable documents = collection
    .find(parseFilter("{ status: \"D\" }"))
    .projection(parseFilter("{ item: 1, status: 1, _id: 0 }"));

展示:

Document{{item=paper, status=D}}
Document{{item=planner, status=D}}
Document{{item=paper, status=D}}
Document{{item=planner, status=D}}
Document{{item=paper, status=D}}
Document{{item=planner, status=D}}
  1. 包含

 //SELECT * FROM inventory WHERE status in ("A", "D")
 FindIterable cursor = collection.find(parseFilter("{ status: { $in: [ \"A\", \"D\" ] } }"));

  1. and 与 比较运算符

//SELECT * FROM inventory WHERE status = "A" AND qty < 30
FindIterable cursor = collection.find(parseFilter("{ status: \"A\", qty: { $lt: 30 } }"));

其中 qty 字段使用了比较运算符 $lt 。

"$lt"、"$lte"、"$gt" 和 "$gte" 都属于比较运算符,分别对应 <、<=、> 和>=。

  1. or

//SELECT * FROM inventory WHERE status = "A" OR qty < 30
FindIterable cursor = collection.find(
                parseFilter("{ $or: [ { status: 'A' }, { qty: { $lt: 30 } } ] }"));

  1. and 和 or 同时使用、$regex语法

    /**
     *{
     *    status: 'A',
     *    $or: [
     *      { qty: { $lt: 30 } }, { item: { $regex: '^p' } }
     *    ]
     * }
     */
 //SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
    FindIterable cursor = collection.find(
            parseFilter("{\n" +
                    "   status: 'A',\n" +
                    "   $or: [\n" +
                    "     { qty: { $lt: 30 } }, { item: { $regex: '^p' } }\n" +
                    "   ]\n" +
                    "}"));

注意看:or 条件下使用正则匹配的语法,这里使用到了sql中like的统配语法例子:

Item LIKE "p% => { item: { $regex: '^p' }

通过 $regex 代表通过使用正则来匹配字段名。

二. 查询数组

ing:

从查询返回的项目字段

三. 查询嵌套文档

ing:

从查询返回的项目字段

你可能感兴趣的:(#,mongodb,mongodb,数据库)