JavaEE:MongoDB安裝與使用

說明:

文檔型數據庫,採用BSON格式。介於關係型數據庫和非關係型數據庫之間,屬於NoSQL數據庫之一。
適合大數據場景使用,大量數據寫入操作。

一個文檔==表中的一行數據,(多個文檔)集合==(多行數據)表,多個集合(表)組成數據庫。

一、Docker中安裝MongoDB服務器:

1.創建mongo容器(端口27017):

docker run -di --name=mall_mongo -p 27017:27017 mongo

2.連接登錄mongo數據庫(安裝在本機地址爲:127.0.0.1):

mongo 192.168.1.119

3.退出(>表示已登錄):

> exit

二、數據類型:

1.基本數據類型:

(1)null類型:
{"key1": null}

(2)布爾類型(true或false):
{"key1": false}

(3)數值類型:
浮點型(默認):
{"key1": 1.0}
4字節整數:
{"key1": NumberInt("1")}
8字節整數:
{"key1": NumberLong("1")}

(4)字符串類型(UTF-8編碼):
{"key1": "value1"}

(5)日期類型:
{"key1", new Date()}

(6)正則表達式類型(js正則語法):
{"key1": /[abcdef]/}

(7)數組類型:
{"key1": ["value1", "value2"]}

(8)內嵌文檔類型(類似json):
{"key1": {"key2": "value1"}}

(9)對象ID類型(自動生成12字節長的字符串):{"_id": ObjectId("xxx...")}

(10)二進制類型(任意字符串的字節方式,用於存儲非UTF-8類型的字符串)。

(11)js代碼類型:{"key1": function(){/.../}}

三、mongo命令:

1.創建/顯示數據庫/表的一些命令:

#創建或使用數據庫,此處數據庫名爲mydb
> use mydb
#顯示數據庫列表
> show dbs
#顯示當前數據庫
> db
#創建表,此處表名爲user
> db.createCollection("user")
#顯示所有表
> show collections

2.插入數據:

語法:db.表名.insert({列名1: 值1, 列名2: 值1})

> db.user.insert({_id: "0", name: "先生1", age: 18})

3.查詢數據(沒有表時自動創建):

語法:db.表名.find({查詢條件})

(1)查全部:

> db.user.find()

(2)按條件查(name=先生1):

> db.user.find({name: "先生1"})

(3)查第1條:

> db.user.findOne()

(4)查前面N條(skip爲跳過幾條,limit爲取幾條):

> db.user.find().skip(0).limit(10)

(5)模糊查詢(語法:/要匹配的字符串/):

#匹配所有name列帶"先"的
> db.user.find({name: /先/})
#匹配name列以"先"開頭的
> db.user.find({name: /^先/})

(6)比較操作符(<、<=、>、>=):

#age>18
> db.user.find({age: {$gt: 18}})
#age>=18
> db.user.find({age: {$gte: 18}})
#age<18
> db.user.find({age: {$lt: 18}})
#age<=18
> db.user.find({age: {$lte: 18}})
#age!=18
> db.user.find({age: {$ne: 18}})

(7)包含/不包含:

#name包含多個值:
> db.user.find({name: {$in: ["先生1", "先生2"]}})
#name不含這些值:
> db.user.find({name: {$nin: ["先生1", "先生2"]}})

(8)條件連接(同時滿足多個條件):

#邏輯與:$and: [{條件1}, {條件2}, ...]
> db.user.find({$and: [{name: "先生1"}, {name: "先生2"}]})
#邏輯或:$or: [{條件1}, {條件2}, ...]
> db.user.find({$or: [{name: "先生1"}, {name: "先生2"}]})

4.修改數據:

(1)語法:db.表名.update({查詢條件}, {$set: {新數據}})

> db.user.update({_id: "0"}, {$set: {name: "先生2"}})

(2)列值增長(將原有列數值增加指定值):

語法:db.表名.update({查詢條件}, {$inc: {列名: 要增加的值}})

> db.user.update({_id: "0"}, {$inc: {age: 1}})

5.刪除數據:

語法:db.表名.remove({條件})

(1)刪全部:

> db.user.remove({})

(2)按條件刪:

> db.user.remove({_id: "0"})

6.統計條數:

語法:db.表名.count({條件})

> db.user.count({name: "先生"})

四、用MongoDB-Api操作MongoDB數據:

1.導入MongoDB驅動包:

<dependencies>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.12.5</version>
    </dependency>
</dependencies>

2.增刪改查(Dao類要加上@Component被掃描創建實例):

連接/關閉:

//獲取表操作對象
private MongoCollection<Document> getTableObject() {
    //建立數據庫連接
    mClient = new MongoClient("192.168.3.119");
    //獲取mydb數據庫操作對象
    MongoDatabase db = mClient.getDatabase("mydb");
    //獲取User表操作對象
    MongoCollection<Document> table = db.getCollection("user");
    return table;
}
//關閉連接
private void close() {
    if (mClient != null) {
        //關閉連接
        mClient.close();
        mClient = null;
    }
}

(1)插入數據:

//插入數據
public void insert(User user) {
    //1.獲取User表操作對象
    MongoCollection<Document> table = getTableObject();
    //2.創建數據
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("_id", user.getId());
    map.put("name", user.getName());
    map.put("age", user.getAge());
    //3.創建一條文檔記錄
    Document item = new Document(map);
    //4.執行插入操作
    table.insertOne(item);
    //4.table.insertMany(null);  //插入多個
    //5.關閉連接
    close();
}

(2)刪除數據:

//刪除數據
public void delete(String id) {
    //1.獲取User表操作對象
    MongoCollection<Document> table = getTableObject();
    //2.創建條件
    BsonDocument bson = new BsonDocument();
    bson.put("_id", new BsonString(id)); //BsonInt32爲int,BsonBoolean爲boolean
    //3.執行刪除
    table.deleteOne(bson);
    //4.關閉連接
    close();
}

(3)更新數據:

//更新數據
public void update(User user) {
    //1.獲取User表操作對象
    MongoCollection<Document> table = getTableObject();
    //2.創建新數據
    Map<String, Object> newData = new HashMap<>();
    newData.put("name", user.getName());
    newData.put("age", user.getAge());
    //3.執行更新,第1個參數Filters.eq爲條件,第2個參數爲新數據,$set表示設值
    table.updateMany(Filters.eq("_id", user.getId()), new Document("$set", newData));
    //4.關閉連接
    close();
}

(4)查詢數據:

//查詢全部
public List<User> findAll() {
    List<User> users = new ArrayList<User>();
    //1.獲取User表操作對象
    MongoCollection<Document> table = getTableObject();
    //2.查詢所有
    FindIterable<Document> result = table.find();
    if (result == null) {
        return users;
    }
    //3.取出數據
    for (Document item : result) {
        /*
        item.getString("key1");  //取String類型的值
        item.getInteger("key1"); //取int類型
        item.getDouble("key1");  //取double類型
        item.getBoolean("key1");  //取boolean類型
        item.getDate("key1");    //取Date類型
        item.getLong("key1");    //取long類型
        */
        users.add(new User(item.getString("_id"), item.getString("name"), item.getInteger("age")));
    }
    //4.關閉連接
    close();
    return users;
}

//按條件查詢
public List<User> query(String id, String name, int age) {
    List<User> users = new ArrayList<User>();
    //1.獲取User表操作對象
    MongoCollection<Document> table = getTableObject();

    //2.建立條件對象
    //條件:_id = 0
    BasicDBObject where1 = new BasicDBObject("_id", "0");
    //條件:age >= 18
    BasicDBObject where2 = new BasicDBObject("age", new BasicDBObject("$gte", 18));
    //模糊查詢:name中有"先生"字的
    BasicDBObject where3 = new BasicDBObject("name", new BasicDBObject("$regex", "先生"));

    //3.執行查詢
    FindIterable<Document> result = table.find(where1);
    if (result == null) {
        return users;
    }
    //4.取出查詢結果
    for (Document item : result) {
        users.add(new User(item.getString("_id"), item.getString("name"), item.getInteger("age")));
    }
    //5.關閉連接
    return users;
}

五、SpringData-MongoDB使用:

1.導入SpringData-MongoDB依賴包:

<dependencies>
    <!-- 導入SpringData-MongoDB依賴包 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
</dependencies>

2.創建application.yml,配置mongodb服務器地址與數據庫名:

server:
  port: 10003  #本微服務端口
spring:
  application:
    name: mall-mongodb   #本微服務名稱
  data:
    mongodb:
      host: 192.168.3.119  #mongodb服務器地址
      database: mydb   #數據庫名稱

3.創建實體類:

@Document(collection = "user")  //映射表的名字
public class User implements Serializable {
    @Id  //數據庫_id
    private String _id;
    private String name;
    private int age;
    public String get_id() {
        return _id;
    }
    public void set_id(String _id) {
        this._id = _id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

4.創建Dao接口類(SpringData-MongoDB數據操作類):

//SpringData-MongoDB數據操作類
@Component
public interface UserDao extends MongoRepository<User, String> { //dao需要繼承MongoRepository
}

5.調用Dao實現類進行增刪改查操作:

@Transactional  //開啓事務
@Service  //標識此類爲業務層類(service層)
public class UserBiz {//操作Dao的業務類
    @Autowired
    private UserDao userDao; //dao操作類
    @Autowired
    private MongoTemplate mongoTemplate; //MongoDB原生API操作類
    //插入數據
    public void insert(User user) {
        userDao.insert(user);
    }
    //刪除數據
    public void delete(String id) {
        userDao.deleteById(id);
    }
    //更新數據
    public void update(User user) {
        userDao.save(user);
    }
    //使用MongoTemplate更新數據
    public void updateByTemplate(User user) {
        //1.增加查詢條件:_id=xxx
        Query q = new Query();
        q.addCriteria(Criteria.where("_id").is(user.get_id()));
        //2.設置新數據
        Update u = new Update();
        u.set("name", user.getName());
        u.set("age", user.getAge());
        //3.執行更新
        mongoTemplate.updateFirst(q, u, "user");
    }
    //查詢全部
    public List<User> findAll() {
        return userDao.findAll();
    }
    //按條件查詢單個
    public User findById(String id) {
        return userDao.findById(id).get();
    }
    //分頁查詢
    public List<User> queryPage(int pageIndex, int pageSize) {//pageIndex頁碼從0開始,pageSize一頁多少條
        Pageable pageable = PageRequest.of(pageIndex, pageSize);  //創建分頁條件
        return userDao.queryPage(pageable).getContent(); //分頁查詢
    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章