Java简单操作MongoDB

前面已经掌握了mongo最基本的一些命令,对各个命令也都实操过,理解各命令的意思,也对mongo有了最基本的理解,但大部分猿还是想使用Java去连接mongo,串串也不例外

  • 在pom.xml中加入mongodb-java-driver.jar的依赖

    • Maven项目依赖

      1
      2
      3
      4
      5
      <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.0.4</version>
      </dependency>
    • SpringBoot项目依赖

      1
      2
      3
      4
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
      </dependency>
  • 连接mongo

    • 认证连接

      1
      2
      3
      4
      5
      6
      7
      8
      // 创建验证信息,根据加密方式选择MongoCredential内对应的加密方式
      List<MongoCredential> credentials = new ArrayList<>();
      MongoCredential credential = MongoCredential.createCredential("admin", "test1", "admin".toCharArray());
      credentials.add(credential);

      // 创建mongo服务地址
      ServerAddress serverAddress = new ServerAddress("localhost", 27017);
      MongoClient mongoClient = new MongoClient(serverAddress, credentials);
    • 无需认证连接

      1
      MongoClient client = new MongoClient("localhost", 27017);

      然后就可以通过MongoClient的实例方法对mongo进行相关操作了

  • 创建数据库连接

    1
    MongoDatabase db = client.getDatabase("test1");

    mongo特性是不管数据库事先是否存在,都可以正常创建数据库连接,不会像MySQL一样报错,连接成功后,在mongo服务器上执行show dbs,会发现仍然查不到我们连接的这个数据库,这是正常情况,只有在数据库中有数据的时候,才会查得出来,client.getDatabase("test") === use test命令

  • 创建集合

    • 使用数据库连接实例方法创建一个空的集合
    1
    2
    3
    4
    db.createCollection("base_info");

    ---
    命令:db.createCollection("base_info")
    • 直接向创建的集合中插入数据
    1
    2
    3
    4
    5
    MongoCollection<Document> collection = db.getCollection("base_info");
    collection.insertOne(new Document("name", "lxl"));

    ---
    命令:db.base_info.insert({"name": "lxl"})

    以上两种方式均可创建一个集合,区别在于第一种方式创建的是空集合,

  • 删除集合

    1
    2
    3
    4
    collection.drop();

    ---
    命令:db.base_info.drop()

对集合的CRUD

  • 新增数据

    • 单条新增

      1
      2
      Document document = new Document().append("name","cc").append("age",30).append("location","SZ");
      collection.insertOne(document);
    • 批量新增

      1
      2
      3
      4
      5
      6
      List<Document> documentList = new ArrayList<>();
      for (int i = 0; i < 1000; i++) {
      Document doc = new Document().append("name", "cc" + i).append("age", new Random().nextInt(100)).append("location", "SZ");
      documentList.add(doc);
      }
      collection.insertMany(documentList);

    insertOne(Document)方法每次插入一条数据

    insertMany(List)方法批量插入数据,并且可以通过参数InsertManyOptions设置是否排序

  • 删除数据

    • 删除第一条匹配的数据
    1
    2
    3
    4
    5
    Bson condition = Filters.eq("age", 99);
    collection.deleteOne(condition);

    ---
    命令:db.base_info.deleteOne({"age": 99})
    • 删除所有匹配数据
    1
    2
    3
    4
    5
    Bson condition = Filters.eq("age", 99);
    collection.deleteMany(condition);

    ---
    命令:db.base_info.deleteMany({"ag": 99})
  • 查询数据

    • 查询返回第一条匹配的数据

      1
      2
      3
      4
      Bson condition = Filters.eq("age", 16);
      FindIterable<Document> vals = collection.find(condition);
      Document document = vals.first();
      System.out.println(document.toJson());

      通过调用FindIterable的实例方法first()取第一条数据

    • 查询返回所有匹配数据

      1
      2
      3
      4
      5
      Bson condition = Filters.eq("age", 16);
      FindIterable<Document> vals = collection.find(condition);
      for (Document val : vals) {
      System.out.println(val.toJson());
      }

      find()方法返回所有匹配数据

    • 分页查询

      分页查询是我们日常开发中经常用到的功能,尤其是mongo这种量级较大的存储,分页使用limit()和skip()两个方法来实现,limit指定查询的条数,skip进行分页,参数为从第几条开始,需要使用当前页码和分页条数进行计算(pageNo - 1) * pageSize

      1
      2
      3
      4
      5
      Bson condition = Filters.lt("age", 2);
      FindIterable<Document> vals = collection.find(condition).limit(10).skip(10).sort(Sorts.descending("age"));
      for (Document val : vals) {
      System.out.println(val.toJson());
      }

      limit(10): 每页取10条数据

      skip(10): 从第11条开始查询,起始位置为0

      sort(Sorts.descending(“age”)): 以列age倒序

      对应MySQL:select * from base_info where age < 2 order by age desc limit 7, 7

  • 更新数据

    • 更新第一条匹配数据中的某些字段

      1
      2
      3
      Bson condition = Filters.eq("age", 15);
      Document document = new Document("$set", new Document("location", "XZ"));
      collection.updateOne(condition, document);

      注意这里有一个$set,这个指令是必须的,相对应的指令还有$inc

    • 替换第一条匹配数据全部内容

      1
      2
      3
      Bson condition = Filters.eq("age", 15);
      Document document = new Document("location", "XZ");
      collection.updateOne(condition, document);

      没有$set指令,则表示使用参数document替换掉第一条匹配到的数据

    • 第一条匹配的数据中指定字段数量+1

      1
      2
      3
      Bson condition = Filters.eq("location", "XZ");
      Document document = new Document("$inc", new Document("age", 1));
      collection.updateOne(condition, document);
    • 更新所有匹配数据

      1
      2
      3
      Bson condition = Filters.eq("age", 15);
      Document document = new Document("$set", new Document("location", "XZ"));
      collection.updateMany(condition, document);

全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Sorts;

/**
* @author: cc
*/
public class MongoConnectTest {

public static void main(String[] args) {
MongoClient client = new MongoClient("localhost", 27017);
try {
/*
// 创建验证信息,根据加密方式选择MongoCredential内对应的加密方式
List<MongoCredential> credentials = new ArrayList<>();
MongoCredential credential = MongoCredential.createCredential("admin", "test", "".toCharArray());
credentials.add(credential);

// 创建mongo服务地址
ServerAddress serverAddress = new ServerAddress("localhost", 27017);
MongoClient mongoClient = new MongoClient(serverAddress, credentials);*/

MongoDatabase db = client.getDatabase("test1");

// 创建集合
// 方式1
// db.createCollection("base_info2");
// 方式2
MongoCollection<Document> collection = db.getCollection("base_info");
// collection.insertOne(new Document("name", "lxl"));

// 删除集合
// collection.drop();

// 新增数据
// 单条新增
/*Document document = new Document().append("name", "cc").append("age", 30).append("location", "SZ");
collection.insertOne(document);
// 批量新增
List<Document> documentList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
Document doc = new Document().append("name", "cc" + i).append("age", new Random().nextInt(100))
.append("location", "SZ");
documentList.add(doc);
}
collection.insertMany(documentList);*/

// 删除数据
// 删除第一条匹配数据
/*Bson condition = Filters.eq("age", 99);
collection.deleteOne(condition);
// 删除所有匹配数据
collection.deleteMany(condition);*/

// 修改数据
// 修改第一条匹配数据
/*Bson condition = Filters.eq("age", 15);
Document document = new Document("$set", new Document("location", "XZ"));
collection.updateOne(condition, document);
collection.updateMany(condition, document);*/
// 年龄+1
/*Bson condition = Filters.eq("location", "XZ");
Document document = new Document("$inc", new Document("age", 1));
collection.updateOne(condition, document);*/

// 查询返回第一条匹配数据
Bson condition = Filters.lt("age", 2);
FindIterable<Document> vals = collection.find(condition).sort(Sorts.descending("age")).limit(7).skip(7);
// Document document = vals.first();
// System.out.println(document.toJson());
for (Document val : vals) {
System.out.println(val.toJson());
}

} catch (Exception e) {
e.printStackTrace();
}
}

}