0
点赞
收藏
分享

微信扫一扫

Java操作MongoDB(进阶篇)


1.导包

<dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.0.4</version>
        </dependency>

2.操作

一些简单的增删改查我就不说了,百度一大堆,这里主要讲比较复杂的查询

我使用的可视化工具是: nosqlbooster4mongo-6.1.8;提取码:pxgz

分组查询

释义:

对user表中createTime小于1603814400000的数据,按照userName进行分组,排除出现次数少于两次的数据,显示userName和出现次数

MongoDB:

db.user.aggregate([
 	{
        $match : { 
             "createTime":{$lt : 1603814400000}
        }
    }
    ,
    {
        $group : {
            _id : "$userName",
            count: { $sum : 1}
        }
    }
    ,
    {
        $match : { 
            count : { $gt : 2 }
        }
    }
],{ allowDiskUse: true })

时间存储我建议直接用时间戳,用Date类型一大堆坑

allowDiskUse: true:这一段在数据量大的时候需要加上,不然会报错
$match:放前面相当于mysql里面的where,放后面相当于mysql里面的having

比较函数

释义

$gt

(>) 大于

$lt

(<) 小于

$gte

(>=) 大于等于

$lte

(<= ) 小于等于

统计函数

释义

$sum:“$字段“

统计字段之和(换成1就是统计条数)

$avg:“$字段“

统计平均值

$max:“$字段“

统计最大值

$min:“$字段“

统计最小值

$first:“$字段“

显示第一条数据的值

$last:“$字段“

显示最后一条数据的值

$multiply:[ “$字段1”, “$字段2” ]

统计多个字段之和

Java:

MongoClient mongoClient = new MongoClient("localhost", 27017);
        MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb");
        MongoCollection<Document> collection = mongoDatabase.getCollection("user");

        Document where = new Document("$match",new Document("createTime",new Document("$lt",1603814400000L)));

        Document group = new Document("$group", new Document("_id", "$userName").append("count",new Document("$sum",1)));

        Document match = new Document("$match",new Document("count",new Document("$gt",2)));

        List<Document> aggregateList = new ArrayList<>();
        aggregateList.add(where);
        aggregateList.add(group);
        aggregateList.add(match);

        MongoCursor<Document> cursor = collection.aggregate(aggregateList).allowDiskUse(true).iterator();

        List<Document> list = new ArrayList<>();
        while (cursor.hasNext()){
            Document next = cursor.next();
            System.out.println(next);
        }
        mongoClient.close();

MySql:

SELECT
	userName AS _id,
	sum( 1 ) AS count 
FROM
	`user` 
WHERE
	createTime < 1603814400000 GROUP BY userName HAVING count >2

多条件模糊查询

释义:

查询user表,address包含深圳或广州,并且userName以一结尾、phone以134开头的信息

MongoDB:

db.user.find(
    {
        $and:[
            {"userName":{$regex:"一$"}},
            {"phone":{$regex:"^134"}}
        ],
        $or:[
            {"address":{$regex:"广州"}},
            {"address":{$regex:"深圳"}}
        ]
    }
)

Java:

MongoClient mongoClient = new MongoClient("localhost", 27017);
        MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb");
        MongoCollection<Document> collection = mongoDatabase.getCollection("user");

        Document userNameDocument = new Document("userName",new Document("$regex","一$"));
        Document phoneDocument = new Document("phone",new Document("$regex","^134"));

        List<Document> and = new ArrayList<>();
        and.add(userNameDocument);
        and.add(phoneDocument);

        Document address1 = new Document("userName",new Document("$regex","广州"));
        Document address2 = new Document("phone",new Document("$regex","深圳"));

        List<Document> or = new ArrayList<>();
        and.add(address1);
        and.add(address2);

        Document document = new Document();
        document.append("$and",and);
        document.append("$or",or);

        MongoCursor<Document> iterator = collection.find(document).iterator();

        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

MySql:

SELECT
	* 
FROM
	`user` 
WHERE
	userName LIKE '%一' 
	AND phone LIKE '134%' 
	AND ( address LIKE '%广州%' OR address LIKE '%深圳%' )


举报

相关推荐

0 条评论