zoukankan      html  css  js  c++  java
  • 配置mongodb数据库 以及 数据库管理mongo-express UI 在Windows上wsl2 Docker

    配置mongodb数据库 以及 数据库web管理mongo-express UI 在Windows上wsl2 Docker


    确保你配置好了Docker -> windows上wsl2引擎安装Docker教程https://www.cnblogs.com/eternalnight/p/15173158.html
    // 拉取mongodb镜像
    docker pull mongo
    docker network create --subnet=172.16.0.0/16 docker-network
    // 运行容器 映射27017端口也是mongodb默认端口, --rm 是只运行一次结束时会自动清除。如果想持久就改成 -it即可 --auth 验证账号密码
    docker run -d -p 27017:27017 --network docker-network --ip 172.16.0.102 --name mongo_master -e "MONGO_INITDB_ROOT_USERNAME=pudge" -e "MONGO_INITDB_ROOT_PASSWORD=9527" mongo
    // 再开一个窗口进入mongodb配置账号, 以管理权限进入.
    docker exec -it mongo_master mongo admin
    // 用管理权限进入
    docker exec -it mongo_master mongo --host 127.0.0.1 --port 27017 -u "pudge" -p "9527" --authenticationDatabase "admin"
    // 一定要用use 否则就会默认在test创建用户
    use admin;
    db.createUser({ user: 'pudge', pwd: '9527', roles: [ { role: "root", db: "admin" } ] }); // 验证账号 1 代码正常 db.auth("pudge", "9527"); exit; docker exec -it mongo_master mongo --host 127.0.0.1 --port 27017 -u "pudge" -p "9527" --authenticationDatabase "admin" // 创建db库用户和权限,先得use这个库会自动创建 use PudgeDB; // 创建只有读写权限的账号和分配app数据库 db.createUser({ user: 'pudge', pwd: '9527', roles: [ { role: "readWrite", db: "PudgeDB" } ] }); db.auth("pudge", "9527"); exit

    图形工具管理, 这里推荐的两种UI的搭建方式。  docker 或node.js

    // 接着用docker操作一遍吧
    docker pull mongo-express
    // 成功了之前原因是docker容器无法识别localhost或127.0.0.1必须有域名或者 host.docker.internal
    docker run -it --name mongo_ui --network docker-network --ip 172.16.0.103 -p 8081:8081 -e ME_CONFIG_BASICAUTH_USERNAME="pudge" -e ME_CONFIG_BASICAUTH_PASSWORD="9527" -e ME_CONFIG_MONGODB_URL="mongodb://pudge:9527@host.docker.internal:27017/admin?ssl=false" -e ME_CONFIG_MONGODB_AUTH_DATABASE="admin" -e ME_CONFIG_MONGODB_AUTH_USERNAME="pudge"  -e ME_CONFIG_MONGODB_AUTH_PASSWORD="9527" mongo-express
    
    // node.js版本在16.7.0 建议用 nvm管理node.js版本
    npm install -g mongo-express
    // 前往node.js
    cd F:
    vmv16.7.0
    ode_modulesmongo-express
    copy config.default.js config.js

    把config.js的内容配置如下, 由于官方的要求是全局变量配置, 但我这觉得太麻烦, 就直接改了能用就行。

    'use strict';
    
    let mongo = {
      // Setting the connection string will only give access to that database
      // to see more databases you need to set mongodb.admin to true or add databases to the mongodb.auth list
      // It is RECOMMENDED to use connectionString instead of individual params, other options will be removed later.
      // More info here: https://docs.mongodb.com/manual/reference/connection-string/
      connectionString: process.env.ME_CONFIG_MONGODB_SERVER ? '' : process.env.ME_CONFIG_MONGODB_URL,
      host: '127.0.0.1',
      port: '27017',
      dbName: 'PudgeDB',
    };
    
    
    // Accessing Bluemix variable to get MongoDB info
    if (process.env.VCAP_SERVICES) {
      const dbLabel = 'mongodb-2.4';
      const env = JSON.parse(process.env.VCAP_SERVICES);
      if (env[dbLabel]) {
        mongo = env[dbLabel][0].credentials;
      }
    }
    
    
    const basicAuthUsername = 'ME_CONFIG_BASICAUTH_USERNAME';
    const basicAuthPassword = 'ME_CONFIG_BASICAUTH_PASSWORD';
    const adminUsername = 'ME_CONFIG_MONGODB_ADMINUSERNAME';
    const adminPassword = 'ME_CONFIG_MONGODB_ADMINPASSWORD';
    const dbAuthUsername = 'ME_CONFIG_MONGODB_AUTH_USERNAME';
    const dbAuthPassword = 'ME_CONFIG_MONGODB_AUTH_PASSWORD';
    
    
    function getFile(filePath) {
      if (typeof filePath !== 'undefined' && filePath) {
        const fs = require('fs');
    
    
        try {
          if (fs.existsSync(filePath)) {
            return fs.readFileSync(filePath);
          }
        } catch (err) {
          console.error('Failed to read file', filePath, err);
        }
      }
      return null;
    }
    
    
    function getFileEnv(envVariable) {
      const origVar = process.env[envVariable];
      const fileVar = process.env[envVariable + '_FILE'];
      if (fileVar) {
        const file = getFile(fileVar);
        if (file) {
          return file.toString().split(/
    ?
    /)[0].trim();
        }
      }
      return origVar;
    }
    
    
    function getBinaryFileEnv(envVariable) {
      const fileVar = process.env[envVariable];
      return getFile(fileVar);
    }
    
    
    const meConfigMongodbServer = process.env.ME_CONFIG_MONGODB_SERVER
      ? process.env.ME_CONFIG_MONGODB_SERVER.split(',')
      : false;
    
    
    const INFOS = {
      username: "pudge",
      password: "9527",
      server: "localhost",
      port: "27017",
      dbName: "PudgeDB",
    }
    function getConnectionStringFromEnvVariables() {
      const infos = {
        // server: mongodb hostname or IP address
        // for replica set, use array of string instead
        server: (
          meConfigMongodbServer.length > 1 ? meConfigMongodbServer : meConfigMongodbServer[0]
        ) || mongo.host,
        port: process.env.ME_CONFIG_MONGODB_PORT || mongo.port,
        dbName: process.env.ME_CONFIG_MONGODB_AUTH_DATABASE || mongo.dbName,
    
    
        // >>>> If you are using an admin mongodb account, or no admin account exists, fill out section below
        // >>>> Using an admin account allows you to view and edit all databases, and view stats
        // leave username and password empty if no admin account exists
        username: getFileEnv(adminUsername) || getFileEnv(dbAuthUsername) || mongo.username,
        password: getFileEnv(adminPassword) || getFileEnv(dbAuthPassword) || mongo.password,
      };
      const login = INFOS.username ? `${INFOS.username}:${INFOS.password}@` : '';
      return `mongodb://${login}${INFOS.server}:${INFOS.port}/${INFOS.dbName}`;
    }
    
    
    const sslCA = 'ME_CONFIG_MONGODB_CA_FILE';
    const sslCAFromEnv = getBinaryFileEnv(sslCA);
    
    
    module.exports = {
      mongodb: {
        // if a connection string options such as server/port/etc are ignored
        connectionString: mongo.connectionString || getConnectionStringFromEnvVariables(),
    
    
        connectionOptions: {
          // ssl: connect to the server using secure SSL
          ssl: process.env.ME_CONFIG_MONGODB_SSL || mongo.ssl,
    
    
          // sslValidate: validate mongod server certificate against CA
          sslValidate: process.env.ME_CONFIG_MONGODB_SSLVALIDATE || true,
    
    
          // sslCA: array of valid CA certificates
          sslCA: sslCAFromEnv ? [sslCAFromEnv] : [],
    
    
          // autoReconnect: automatically reconnect if connection is lost
          autoReconnect: true,
    
    
          // poolSize: size of connection pool (number of connections to use)
          poolSize: 4,
        },
    
    
        // set admin to true if you want to turn on admin features
        // if admin is true, the auth list below will be ignored
        // if admin is true, you will need to enter an admin username/password below (if it is needed)
        admin: process.env.ME_CONFIG_MONGODB_ENABLE_ADMIN
          ? process.env.ME_CONFIG_MONGODB_ENABLE_ADMIN.toLowerCase() === 'true'
          : false,
    
    
        // whitelist: hide all databases except the ones in this list  (empty list for no whitelist)
        whitelist: [],
    
    
        // blacklist: hide databases listed in the blacklist (empty list for no blacklist)
        blacklist: [],
      },
    
    
      site: {
        // baseUrl: the URL that mongo express will be located at - Remember to add the forward slash at the start and end!
        baseUrl: process.env.ME_CONFIG_SITE_BASEURL || '/',
        cookieKeyName: 'mongo-express',
        cookieSecret: process.env.ME_CONFIG_SITE_COOKIESECRET || 'cookiesecret',
        host: process.env.VCAP_APP_HOST || 'localhost',
        port: process.env.VCAP_APP_PORT || 8081,
        requestSizeLimit: process.env.ME_CONFIG_REQUEST_SIZE || '50mb',
        sessionSecret: process.env.ME_CONFIG_SITE_SESSIONSECRET || 'sessionsecret',
        sslCert: process.env.ME_CONFIG_SITE_SSL_CRT_PATH || '',
        sslEnabled: process.env.ME_CONFIG_SITE_SSL_ENABLED || false,
        sslKey: process.env.ME_CONFIG_SITE_SSL_KEY_PATH || '',
      },
    
    
      // set useBasicAuth to true if you want to authenticate mongo-express logins
      // if admin is false, the basicAuthInfo list below will be ignored
      // this will be true unless ME_CONFIG_BASICAUTH_USERNAME is set and is the empty string
      useBasicAuth: getFileEnv(basicAuthUsername) !== '',
    
    
      basicAuth: {
        username: getFileEnv(basicAuthUsername) || 'pudge',
        password: getFileEnv(basicAuthPassword) || '9527',
      },
    
    
      options: {
        // Display startup text on console
        console: true,
    
    
        // documentsPerPage: how many documents you want to see at once in collection view
        documentsPerPage: 10,
    
    
        // editorTheme: Name of the theme you want to use for displaying documents
        // See http://codemirror.net/demo/theme.html for all examples
        editorTheme: process.env.ME_CONFIG_OPTIONS_EDITORTHEME || 'rubyblue',
    
    
        // Maximum size of a single property & single row
        // Reduces the risk of sending a huge amount of data when viewing collections
        maxPropSize: (100 * 1000), // default 100KB
        maxRowSize: (1000 * 1000), // default 1MB
    
    
        // The options below aren't being used yet
    
    
        // cmdType: the type of command line you want mongo express to run
        // values: eval, subprocess
        //   eval - uses db.eval. commands block, so only use this if you have to
        //   subprocess - spawns a mongo command line as a subprocess and pipes output to mongo express
        cmdType: 'eval',
    
    
        // subprocessTimeout: number of seconds of non-interaction before a subprocess is shut down
        subprocessTimeout: 300,
    
    
        // readOnly: if readOnly is true, components of writing are not visible.
        readOnly: process.env.ME_CONFIG_OPTIONS_READONLY
          ? process.env.ME_CONFIG_OPTIONS_READONLY.toLowerCase() === 'true'
          : false,
    
    
        // collapsibleJSON: if set to true, jsons will be displayed collapsible
        collapsibleJSON: true,
    
    
        // collapsibleJSONDefaultUnfold: if collapsibleJSON is set to `true`, this defines default level
        //  to which JSONs are displayed unfolded; use number or "all" to unfold all levels
        collapsibleJSONDefaultUnfold: 1,
    
    
        // gridFSEnabled: if gridFSEnabled is set to 'true', you will be able to manage uploaded files
        // ( ak. grids, gridFS )
        gridFSEnabled: process.env.ME_CONFIG_SITE_GRIDFS_ENABLED
          ? process.env.ME_CONFIG_SITE_GRIDFS_ENABLED.toLowerCase() === 'true'
          : false,
    
    
        // logger: this object will be used to initialize router logger (morgan)
        logger: {},
    
    
        // confirmDelete: if confirmDelete is set to 'true', a modal for confirming deletion is
        // displayed before deleting a document/collection
        confirmDelete: false,
    
    
        // noExport: if noExport is set to true, we won't show export buttons
        noExport: false,
    
    
        // noDelete: if noDelete is set to true, we won't show delete buttons
        noDelete: process.env.ME_CONFIG_OPTIONS_NO_DELETE || false,
      },
    
    
      // Specify the default keyname that should be picked from a document to display in collections list.
      // Keynames can be specified for every database and collection.
      // If no keyname is specified, it defaults to '_id', which is a mandatory field.
      // For Example :
      // defaultKeyNames{
      //   "world_db":{  //Database Name
      //     "continent":"cont_name", // collection:field
      //     "country":"country_name",
      //     "city":"name"
      //   }
      // }
      defaultKeyNames: {
      },
    };
    config.js

    这个步骤只有用node.js才需要

    //  这种需要设置了全局才能用 -g
    mongo-express
    // 如果不想全局就在app目录运行
    node app.js
    //访问http://pudge:9527@localhost:8081

    命令行操作

    内建的角色
    数据库用户角色:read、readWrite;
    数据库管理角色:dbAdmin、dbOwner、userAdmin;
    集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
    备份恢复角色:backup、restore;
    所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
    内部角色:__system
    角色说明:
    Read:允许用户读取指定数据库
    readWrite:允许用户读写指定数据库
    dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
    userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
    clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
    readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
    readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
    userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
    dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
    root:只在admin数据库中可用。超级账号,超级权限

    db操作

    > db.dropDatabase()  #删除当前使用数据库> 
    db.cloneDatabase("127.0.0.1") #将指定机器上的数据库的数据克隆到当前数据库>
    db.copyDatabase("mydb", "temp", "127.0.0.1") #将本机的mydb的数据复制到temp数据库中>
    db.repairDatabase() #修复当前数据库> db.getName() #查看当前使用的数据库,也可以直接用db>
    db.stats() #显示当前db状态>
    db.version() #当前db版本>
    db.getMongo() #查看当前db的链接机器地址>
    db.serverStatus() #查看数据库服务器的状态
    基础操作
    // 查看当前数据库状态
    db.stats();db;

    // 命令查询所有数据库列表;
    show dbs;
    // 切换数据库
    use app;

    // 查看数据库表
    db.sirius.stats();

    // 帮助 可以按Tab枚举, 也可以输入以下命令
    db.help();

    // 显示表
    show collections;

    // 删除当前库
    db.dropDatabase();

    // 删除账号
    db.dropUser("pudge_rw");

    // 删除所有账号
    db.dropAllUser();

    // 删除指定的集合(当前为user集合)
    db.user.drop();

    // user表中插入数据
    db.user.insert({"name":"pudge"});
    (1). 查询所有记录
    
    db.user.find();
    
    类似 SELECT* FROM user;
    
    (2). 查询当前集合中的某列去重后的数据
    
    db.user.distinct("name");
    
    以上会过滤掉 name 中的相同数据
    
    类似 SELECT  DISTINCT name  FROM user;
    
    (3). 查询 age = 22 的记录
    
    db.user.find({"age": 22});
    
    类似  SELECT* FROM user;
    
    (4). 查询 age > 22 的记录
    
    db.user.find({age: {$gt: 22}});
    
    类似 SELECT* FROM user WHERE age >22;
    
    (5). 查询 age < 22 的记录
    
    db.user.find({age: {$lt: 22}});
    
    类似 SELECT* FROM user WHERE age <22;
    
    (6). 查询 age >= 25 的记录
    
    db.user.find({age: {$gte: 25}});
    
    类似 SELECT* FROM user WHERE age >= 25;
    
    (7). 查询 age <= 25 的记录
    
    db.user.find({age: {$lte: 25}});
    
    类似 SELECT* FROM user WHERE age <= 25;
    
    (8). 查询 age >= 23 并且 age <= 26
    
    db.user.find({age: {$gte: 23, $lte: 26}});
    
    类似 SELECT* FROM user WHERE age >= 25 AND age<=26;
    
    (9). 查询 name 中包含 mongo 的数据,多用于模糊查询搜索
    
    db.user.find({name: /mongo/});
    
    类似 SELECT* FROM user WHERE name LIKE '%mongo%';
    
    (10). 查询 name 中以 mongo 开头的数据
    
    db.user.find({name: /^mongo/});
    
    类似 SELECT* FROM user WHERE name LIKE 'mongo%';
    
    (11). 查询指定列 name、age 数据
    
    db.user.find({}, {name: 1, age: 1});
    
    类似 SELECT name, age FROM user;
    
    name 也可以用 truefalse,ture 的情况下与name:1 效果一样,如果用 false 就 是排除 name,显示其它列的信息。
    
    (12). 查询指定列 name、age 数据, 并且age > 25
    
    db.user.find({age: {$gt: 25}}, {name: 1, age: 1});
    
    类似 SELECT name, age FROM user WHERE age >25;
    
    (13). 按照列排序 1 升序 -1 降序
    
    升序:db.user.find().sort({age: 1});
    降序:db.user.find().sort({age: -1});
    (14). 查询 name = zhangsan, age = 22 的数据
    db.user.find({name: 'zhangsan', age: 22});
    类似 SELECT * FROM user WHERE name = 'zhangsan' AND age = '22';
    (15). 查询前 5 条数据
    
    db.user.find().limit(5);
    
    类似 SELECT TOP 5 * FROM user;
    
    (16). 查询 10 条以后的数据
    
    db.user.find().skip(10);
    
    类似SELECT * FROM user WHERE id NOT IN ( SELECT TOP 10 * FROM user );
    
    (17). 查询在 5-10 之间的数据
    
    db.user.find().limit(10).skip(5);
    
    可用于分页,limit 是页大小,skip 是第几页乘以页大小的值
    
    类似SELECT * FROM user LIMIT 5,5
    
    (18). OR 查询
    
    db.user.find({$or: [{age: 22}, {age: 25}]});
    
    类似SELECT * FROM user WHERE age = 22 OR age = 25;
    
    (19). findOne 查询第一条数据
    
    db.user.findOne();
    
    类似 SELECT TOP 1 * FROM user;
    
    类似 db.user.find().limit(1);
    
    (20). 查询某个结果集的记录条数,用于统计数量
    
    db.user.find({age: {$gte: 25}}).count();
    
    类似 SELECT COUNT(*) FROM user WHERE age >= 25;
    
    如果要返回限制之后的记录数量,要使用 count(true)或者 count(非 0)
    
    db.user.find().skip(10).limit(5).count(true);
    
    5. MongoDB数据库更新数据
    
    (1). 查找名字为小明的,把年龄更改为 16 岁
    
    db.user.update({"name":"小明"},{$set:{"age":16}});
    
    (2). 查找英语成绩为 70的人,把年龄更改为 33 岁
    
    db.user.update({"score.english":70},{$set:{"age":33}});
    
    (3). 查找所有性别为男的用户把年龄都改为 33 岁
    
    db.user.update({"sex":""},{$set:{"age":33}},{multi: true});
    
    (4). 查找name为小明的用户的信息进行完整替换,注意没有$set了
    
    db.user.update({"name":"小明"},{"name":"大明","age":16});
    
    (5). 查找name为Lisi的用户,将其年龄增加50岁
    
    db.user.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
    
    类似UPDATE user SET age = age + 50 WHERE name = 'Lisi';
    
    (6). 查找name为Lisi的用户,将其年龄增加50岁,姓名改为Wangwu
    
    db.user.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'Wangwu'}}, false, true);
    
    类似update users set age = age + 50, name = 'Wangwu' where name = 'Lisi';
    
    6. MongoDB数据库删除数据
    
    (1). 删除年龄为32的所有用户
    
    db.user.remove({age: 32});
    
    (2). 删除年龄为32的一个用户
    
    db.user.remove( { "age": "32" }, { justOne: true } )

     1379号监听员 Pudge

    
    
    
    
    
    
    
    
     
  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/eternalnight/p/15253592.html
Copyright © 2011-2022 走看看