【mongodb基础-6】mongodb query in java

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

零. 准备工作

引入maven依赖

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.8.2</version>
</dependency>

创建mongodb client与连接一个collection:

static MongoClient mongoClient = MongoClients.create();
static MongoCollection<Document> 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<Document> cursor) {
        try (final MongoCursor<Document> 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<Document> 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<? extends Document> 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<Document> cursor = collection.find(parseFilter("{ status: { $in: [ \"A\", \"D\" ] } }"));

  1. and 与 比较运算符

//SELECT * FROM inventory WHERE status = "A" AND qty < 30
FindIterable<Document> 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<Document> 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<Document> 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:

从查询返回的项目字段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值