Docker は mongoDB をインストールして使用します


提示:以下是本篇文章正文内容,下面案例可供参考

1. mongoDB とは?

MongoDB は、大量のデータ ストレージと高性能の読み取りと書き込みをサポートする NoSQL 非リレーショナル データベースです。

1. mongo のアーキテクチャ

ここに画像の説明を挿入

  1. モンゴで集めるmysqlに相当水面の概念;
  2. モンゴで書類mysqlに相当OKの概念;
  3. モンゴでエリアmysqlに相当フィールド/列の概念;

2. mongoDB の特徴 (または使用シナリオ)

  1. 大量のデータの保存をサポートします (例: ライブ ブロードキャストの報酬データ)。
  2. 頻繁なデータの読み取りと書き込みをサポートします (例: ゲームの小道具)。
  3. データのセキュリティは高くありません。データ エラー (データの損失) があります。
  4. mongoDB はマルチテーブル操作をサポートしておらず、トランザクションもサポートしていません。
  5. mongoDB は Bson ストレージ形式を使用し、動的フィールド管理をサポートします。

3. mongoDB と mysql および redis の比較

redis との比較
1. Redis ピュア メモリ データベースは、メモリが不足すると削除戦略をトリガーします, mongoDB はメモリとディスク ストレージ戦略を使用し、スケーラビリティが高い; 2. mongoDB は Bson ストレージ形式を使用し、
動的フィールド管理をサポートし、拡張を容易にします;
mysql との比較
1. mongoDB複数テーブル操作またはトランザクションをサポートしない;
2. mongoDB は Bson ストレージ形式を使用し、動的フィールド管理をサポートする;
クエリ効率の比較
Redis > MongoDB > MySQL

4. mongoDB ストレージの原則

ここに画像の説明を挿入

  1. mongoDb はメモリとディスクを使用してデータを保存します。
  2. mongoDb はデータの断片化をサポートしており、単一サーバーのディスクが十分でない場合、他のサーバーを直列に接続できます。
  3. クライアントの要求がメモリに到達すると、まず操作記録をログに記録し、次にメモリを操作します。
  4. メモリ内のログは 10 ミリ秒ごとにディスク内のログに同期され、データは 1 分ごとに同期されます。
  5. クライアントはまずメモリ内のデータをクエリし、メモリ内にデータがない場合はディスクをクエリします。
  6. クライアントが書き込むと、最初にメモリに書き込まれ、メモリに書き込んだ直後に要求が返され、メモリ内のデータは同期戦略に従ってディスクに同期されます。
  7. マシンがダウンした場合、サービスが再起動されると、ディスク内のログが解析され、ディスク内のデータと比較され、ディスクに入っていないデータがディスクに書き込まれますが、10ms のデータは失われる可能性があります。

2、docker を使用して mongo をインストールする

1. インストール

  1. mongo イメージをプルする
 docker pull mongo:4.4
  1. mongo データ永続ディレクトリを作成する
mkdir -p /docker_volume/mongodb/data
  1. コンテナを実行する
docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
  1. -v: ホストの /docker_volume/mongodb/data をコンテナーの /data/db ディレクトリにマップし、データをホストに永続化して、コンテナーが削除された後のコンテナー内のデータ損失を防ぎます
  2. –auth: コンテナ サービスにアクセスするにはパスワードが必要です

2. ユーザーを作成する

  1. mongo コンテナーにログインし、[admin] データベースに入る
 docker exec -it mongo mongo admin
  1. ユーザーを作成します。mongo にはデフォルトでユーザーがいません
db.createUser({
    
     user:'root',pwd:'123456',roles:[ {
    
     role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});

[user:'root']: ユーザー名を root に設定します
[pwd:'123456']: パスワードを 123456 に設定します
[role:'userAdminAnyDatabase']: admin データベースでのみ使用可能で、すべてのデータベースのユーザーuserAdmin権限を付与します
[db: 'admin']: 操作可能なデータベース
['readWriteAnyDatabase']: ユーザーに読み取りおよび書き込み権限を付与します

dbAdmin: インデックスの作成、削除、統計の表示、system.profile へのアクセスなど、指定されたデータベースでユーザーが管理機能を実行できるようにします。

3. 接続してテストする

  1. mongo データベースに接続する
db.auth('root', '123456')
  1. データベースをテストし、ステートメントを挿入します
 db.user.insert({
    
    "name":"zhangsan","age":18})
  1. データベースをテストし、挿入したステートメントをクエリする
 db.user.find()

ここに画像の説明を挿入

  1. navicat 接続テスト
    ここに画像の説明を挿入

3.SpringBoot は mongoDB を統合します

  1. 座標をインポート
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
             <version>2.3.9.RELEASE</version>
        </dependency>
  1. yml 構成を追加する
spring:
  data:
    mongodb:
      uri: mongodb://192.156.136.168:27017/testdb
      username: root
      password: 123456
  1. エンティティ クラスの書き込み
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Data
@AllArgsConstructor
@NoArgsConstructor
//指定实体类和数据库文档的映射关系    默认实体类名  数据库如果没有该文档,会自动创建
@Document(value="tb_person")
public class Person {
    
    
    @Id
    private ObjectId id; //mongoDB推荐使用ID
    //指定属性名和数据库域的映射关系   默认属性名
    @Field("person_name")
    private String name;
    private int age;
    private String address;
}

1. @Document(value=“tb_person”): エンティティクラスとデータベースドキュメントのマッピング関係を指定 デフォルトのエンティティクラス名データベース そのようなドキュメントがない場合は、自動的に作成されます 2. @Field(“person_name”): / /属性名と
データベース ドメイン マッピング関係のデフォルト属性名を指定します

  1. テストクラス
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.test.context.junit4.SpringRunner;
  
    /**
     * 多条件查询
     */
    @Test
    public void find() {
    
    
        //设置查询条件 age小于30,且person_name="张三"
        Criteria criteria = Criteria.where("age").lt(30)
                .and("person_name").is("张三");
        
        //设置查询条件
        Query query = new Query(criteria);
        //查询
        List<Person> list = mongoTemplate.find(query, Person.class);

        for (Person person : list) {
    
    
            System.out.println(person);
        }
    }

    /**
     * 分页查询
     */
    @Test
    public void findPage() {
    
    
        //设置查询条件 age小于30,且person_name="张三"
        Criteria criteria = Criteria.where("age").lt(30)
                .and("person_name").is("张三");

        //根据条件 查询总数
        Query queryCount = new Query(criteria);
        long count = mongoTemplate.count(queryCount, Person.class);


        //查询当前页的数据列表, 查询第二页,每页查询2条
        Query queryLimit = new Query(criteria)
                .with(Sort.by(Sort.Order.desc("age")))
                .limit(2)//每页查询条数
                .skip(2); //从第几页开始 (page-1)*size

        List<Person> list = mongoTemplate.find(queryLimit, Person.class);
        for (Person person : list) {
    
    
            System.out.println(person);
        }
    }
    
    /**
     * 更新数据
     */
    @Test
    public void update() {
    
    
        //设置查询条件 age小于30,且person_name="张三"
        Criteria criteria = Criteria.where("person_name").is("王五");
        //设置更新条件
        Query query = new Query(criteria);
        //设置更新数据
        Update update = new Update();
        update.set("age", 16);
        mongoTemplate.upsert(query, update, Person.class);
    }

    /**
     * 保存
     */
    @Test
    public void save() {
    
    
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        mongoTemplate.save(person);
    }
    
    /**
     * 删除数据
     */
    @Test
    public void dlete() {
    
    
        mongoTemplate.remove(Query.query(Criteria.where("person_name").is("张三")), Person.class);
    }
  1. mongoDB インデックス
    提示:1 :升序索引 -1 :降序索引
#查看索引
db.user.getIndexes()
#创建索引
#db.user.createIndex({
    
    'age':1})

4. mongoDB のネイティブ使用

追加

db.tb_person.insert({
    
    person_name: "陈六", age: 16})

改訂

-- 普通修改
db.tb_person.update({
    
    age: 16}, {
    
    $set: {
    
    person_name: "张三"}})

修改格式:
db.collection.update(query, update, [ upsert: boolean, multi: boolean, writeConcern: document])

db.tb_person.update({
    
    age: 16}, {
    
    $set: {
    
    person_name: "张三"}}, {
    
    upsert: true, multi: true})

	--  upsert (默认false: 可选,如果不存在update的记录,是否保存。true为保存。
	--  multi(默认false: 可选,默认只更新第一条记录。true:更新所有匹配数据
	--  writeConcern :可选,抛出异常的级别

消去

-- 普通删除
db.tb_person.remove({
    
    person_name: "张三"})

删除格式:
db.collection.remove(query, update, [ justOne: boolean, writeConcern: document])

db.tb_person.remove({
    
    person_name: "张三"}, false)

	-- justOne: (可选)true:删除第一个匹配记录,false:删除所有
	-- writeConcern :(可选)抛出异常的级别

お問い合わせ

--  查询person_name=张三 或者 年龄 18
db.tb_person.find({
    
    $or:[{
    
    person_name: "张三"},{
    
    age:18 }]}) 

-- 分页查询  以年龄升序排序 跳过第1条数据,查询后面2条数据
db.tb_person.find().sort({
    
    age:1}).limit(2).skip(1)  

-- 查询年龄小于等于21的数据,以年龄降序排序
db.tb_person.find({
    
    age:{
    
    $lte:21}}).sort({
    
    age:-1}) 

一般的なクエリ条件

中国語 シンボル
未満 $lt:
以上 $gt:
以下 $lte:
以上 $gte:
等しくない $ は:

おすすめ

転載: blog.csdn.net/packge/article/details/126539320