Mongodb忘记密码重置方法

下午刚设置的密码,当时忘记保存,晚上去吃了个晚饭回来就忘记了。研究了一会发现也不难,不过网上没有直接搜到就记录一下。

vim /etc/mongodb.conf          # 修改 mongodb 配置,将 auth = true 注释掉,或者改成 false
service mongodb restart        # 重启 mongodb 服务

mongo                          # 运行客户端(也可以去mongodb安装目录下运行这个)
use admin                      # 切换到系统帐户表
db.system.users.find()         # 查看当前帐户(密码有加密过)
db.system.users.remove({})     # 删除所有帐户
db.addUser('admin','password') # 添加新帐户

vim /etc/mongodb.conf          # 恢复 auth = true
service mongodb restart        # 重启 mongodb 服务

如何使用Docker切換不同的MongoDB

在開發前端的時候,常常會碰到想要回到 migration 之前的 MongoDB 資料結構來除錯,如果只使用本地安裝的 MongoDB,操作上會很麻煩,所以這篇文章會說明如何在本機不安裝 MongoDB 的環境下,使用 Docker 準備多份 MongoDB 資料庫。

請確認電腦有安裝 Docker,先準備好要使用的 MongoDB 資料庫備份檔案,大概會是長這樣:

未分类

存放的路徑這裡暫定為

~/Downloads/20170622/hahow/...

打開 Terminal,下載 MongoDB(這裡以 2.6 版作為示範)的 Docker image:

$ docker pull mongo:2.6

然後開啟一個新的 MongoDB Docker container,container 名字可以透過 –name 自訂:

$ docker run --detach --name mongo_hahow_20170622 --publish 27017:27017 mongo:2.6

使用 docker inspect 取得 container 的 IP,後面會用到:

$ docker inspect mongo_hahow_20170622 | grep IPAddress

前往剛才存放備份資料庫的位置:

$ cd ~/Downloads

開啟並進入一個暫時性質的 Docker container,用途為 restore 資料庫到 mongo_hahow_20170622 的 container:

$ docker run --interactive --tty --rm --volume $PWD:/tmp mongo:2.6 bash

因為 ~/Downloads 被 volume 在 /tmp 底下,所以可以根據對應的路徑前往該資料庫存放的資料夾位置:

$ cd /tmp

使用 mongorestore 恢復備份資料庫到 mongo_hahow_20170622,IP 記得使用上面 docker inspect 查到的 IP:

$ mongorestore --host 172.17.0.2 --db hahow 20170622/hahow

如果順利 restore 完成之後,就可以離開,它會自動刪除這個一次性的 container:

$ exit

之後如果還有其它版本的 MongoDB 想要切換著使用的話,可以繼續從第一個步驟建立新的 container。

順帶一提,Docker for Mac 有內建一個叫 Kitematic 的 Docker GUI,可以使用它來切換不同版本的 MongoDB:

未分类

未分类

Ubuntu系统配置Nginx Node.js MongoDB环境

腾讯云最近上线了开发者实验室,主要的功能就是提供一台真实的 VPS,让你现场敲 Linux 命令来完成各种实验任务,比如现场搭建 Python 开发环境、基于 Ubuntu 搭建 WordPress 个人博客等等,所谓“让所有技术更容易入门”。

未分类

目前腾讯云这个服务是免费的,不过是限时免费。比如这篇文章讲的用 Ubuntu 搭建微信小程序服务,就是限制必须 3 个小时内完成实验。如果没完成又想保存学习进度的话,你就要花 65 元买下这个 VPS 才行,否则机器直接会被释放,并且过 24 小时后才能重新开始同样的实验。

未分类

咱看到这个服务就直接玩得不亦乐乎,一晚上直接把所有课程基本刷了一遍,给我的体验呢,感觉就像是程序员的密室逃脱游戏,非常有意思。当然了,既然是个“实验课”,它也会一步一步教你,所以并不是难。

这篇文章呢,算是自己做个 Mark。当然,也是给真正有需要搭建微信小程序服务的同学一点参考。本文的最终效果是成功部署 Node.js + Websocket 构建的网络版锤子剪刀布游戏。

对了,要去玩这个小程序实验的同学,最好有点 Linux 和 Node.js 基础,然后提前准备好一个域名和一个可用的域名 SSL 证书,因为小程序必须采用 HTTPS 访问,然后你还得再三个小时之内当场配置 HTTPS。

1、申请域名和 SSL 证书

(1)、域名服务商推荐 Godaddy / 阿里云 / Name.com,注册一个自己想要的域名。
(2)、由于小程序服务端必须使用 HTTPS 域名连接,所以关于 SSL 证书的申请请看这篇文章:http://devops.webres.wang/2017/07/nginx-config-ssl-force-301-https/

2、注册微信小程序账号

不管你曾经在微信公众平台注册过没有,反正就是要重新注册一个,因为服务号 / 公众号不能和小程序号互换,注册微信小程序账号:https://mp.weixin.qq.com/

3、设置微信公众平台

注册小程序账号进入后,点击设置->开发设置->服务器域名,把你自己注册的域名写入request合法域名和socket合法域名中,后面两个域名不用填。

这一步的原因是:如果在微信上运行的小程序想联网,必须采用这两个合法域名才可以连接,否则直接被微信阻止连接。

4、安装本地开发环境

(1)、开发微信小程序,首先得安装微信 web 开发者工具,下载:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
(2)、下载小程序源码:https://best66.me/wp-content/uploads/2017/07/lab-weapp-client-master.zip

重复一遍呀,这篇文章主要是介绍如何操作服务器并且从零开始搭建微信小程序服务,所以直接给小程序源码了。

5、配置本地开发环境

(1)、在微信 web 开发者工具添加项目,AppID 依旧在微信公众平台->设置->开发设置->开发者 ID 中。
(2)、项目名称随你
(3)、项目目录选择下载的 lab-weapp-client-master 中直接包含 app.js 的目录
(4)、在微信 web 开发者工具打开 app.js(这是一个全局配置文件),将 host 中的域名修改为你自己的域名

6、安装 Node.js

Node.js 是一个 JS 运行环境,通过它可以实现 JS 编写后端服务器。
(1)、连接你的 VPS
(2)、使用下面的命令安装 Node.js

sudo apt-get update  
sudo wget https://mc.qcloudimg.com/static/archive/262420521a966befe17dfa0070ddb272/node-v6.11.0.tar.gz
sudo tar xvf node-v6.11.0.tar.gz
cd node-v6.11.0
sudo ./configure # 自动配置编译
sudo make # 由于 apt-get 安装不到最新版,我们采用编译安装来安装 Node.js。这条命令会执行比较久。
sudo make install # 采用这条命令来编译安装,以便可以在任何地方使用 node 命令
sudo cp /usr/local/bin/node /usr/sbin/

(3)、安装完成后,使用下面的命令测试安装结果,会输出当前的 Node.js 版本:

node -v

7、上传后端源码并安装依赖组件

(1)、上传 data 文件夹到服务器根目录,点击下载。上传后,修改所有文件权限为 a+rw。
(2)、进入此工作目录

cd /data/release/webapp

(3)、在工作目录创建 package.json 文件,并修改文件的访问权限。

sudo touch package.json
sudo chmod a+r+w package.json

(4)、Node.js 的每个包应该有 package.json 描述文件,包含包名、包版本和依赖包等信息。我们修改 package.json 添加我们服务器包的名称和版本号,可参考下面的示例。vi 命令进入修改。

{
    "name": "webapp",
    "version": "1.0.0"
}

(5)、NPM 之于 Node,如同 homebrew 之于 OS X,apt-get 之于 Ubuntu。我们先安装 NPM 包管理工具。

sudo apt-get install npm

(6)、pm2 是一个带有负载均衡功能的 Node 应用的进程管理器,我们的应用最好是通过 pm2 来运行和管理,而不是使用原生的 Node 执行。使用下面的命令安装 pm2

sudo npm install -g pm2 # 全局安装 pm2 模块
# 如果安装时间太长,我们可以用淘宝的镜像来安装:
# sudo npm install -g pm2 --registry=https://registry.npm.taobao.org

我们顺便看看 pm2 支持的命令:

pm2 start app.js # 运行
pm2 logs # 查看工作日志
pm2 restart app #重启

(7)、我们的服务器源码里使用到了 Express 模块,这是一个 Node.js 的 MVC 框架。Express 的调用方法可以看看源码里的 app.js,它是应用的入口。下面的命令使用 NPM 来安装 Express。

cd /data/release/webapp
sudo npm install express --save # 这里一定要在工作目录执行这条命令,因为会自动更新 package.json 的依赖项

(8)、小程序不支持 Cookie 存储和跟踪,服务器需要自行实现会话层。这里我们的源码采用了 MongoDB 在后端存储会话数据、Node 的模块 connect-mongo 来连接数据库。配合腾讯在 Github 上发布的 Express 会话管理中间件 wafer-node-session 实现小程序会话(还支持 redis 等数据库,github)会话管理的相关源码依旧在 app.js 入口文件中,大家可以去研究。

使用 apt-get 在机器上安装 MongoDB 和客户端命令行工具:

sudo apt-get install mongodb-server mongodb -y 

安装结束后,可以使用下面的命令查看安装的版本:

sudo mongod --version
sudo mongo --version

安装 connect-mongo、wafer-node-session 模块:

cd /data/release/webapp
sudo npm install connect-mongo wafer-node-session --save

(9)、WebSocket 是新一代 Web 通讯技术,直接基于 80 端口和 443 端口。通过 WebSocket 我们可以实现玩家直接与服务器双向通信,不用重复进行握手,延时很低。这里我们需要 ws 模块实现 WebSocket。(源码中 websocket.js 用来和玩家直接双向通信,含有游戏入口。而 app.js 是整个 App 的入口,包含 websocket.js)

cd /data/release/webapp
sudo npm install --save ws

(10)、HumanPlayer.js 的源码中使用到了 co 模块进行协程管理,启动游戏服务前,需要先安装:

cd /data/release/webapp
sudo npm install co --save

8、配置 MongoDB

创建目录,用于 MongoDB 数据和日志存储:

sudo mkdir -p /data/mongodb
sudo mkdir -p /data/logs/mongodb

创建后,使用下面的命令来启动 MongoDB:

sudo mongod --fork --dbpath /data/mongodb --logpath /data/logs/mongodb/webapp.log

可以使用下面的命令来检查是否启动成功

netstat -ltp | grep 27017 # 注:27017 是 MongoDB 默认端口

登录本地 MongoDB 服务:

sudo mongo

登录后,创建一个用户 webapp:

use webapp;
db.addUser({ user: 'webapp', pwd: '你想要的密码', roles: ['dbAdmin', 'readWrite']});

创建完成后,使用 exit 退出命令行工具。

9、配置 config.js

config.js 是服务端应用配置文件,调用位置在 app.js 入口文件。config.js 可参考下面的修改。(注:请将 YORU_APP_ID 和 YOUR_APP_SECRET 替换为你申请的小程序对应的 AppID 和 AppSecret)

cd /data/release/webapp
vi config.js
module.exports = { 
    // 8765 是为了设置 Node.js 构建的 Web App 监听端口,使用 http://主机IP:8765/ 可以进行查看
    serverPort: '8765', 

    // 小程序 appId 和 appSecret 
    // 请到 https://mp.weixin.qq.com 获取 AppID 和 AppSecret
    appId: 'YORU_APP_ID', 
    appSecret: 'YOUR_APP_SECRET', 

    // mongodb 连接配置,生产环境请使用更复杂的用户名密码
    mongoHost: '127.0.0.1', 
    mongoPort: '27017', 
    // 27017 是 MongoDB 默认端口,我们没有修改
    mongoUser: 'webapp', 
    mongoPass: '替换为你刚刚设置的密码', 
    mongoDb: 'webapp'
};

10、安装配置 Nginx

微信小程序要求和服务器的通信都通过 HTTPS 进行,所以我们需要用 Nginx 实现 HTTPS,并反向代理到 Node 服务器来处理。

(1)、在 Ubuntu 上,可直接使用 apt-get 来安装 Nginx

sudo apt-get install nginx -y

(2)、安装完成后,使用 nginx 命令启动 Nginx:

sudo /etc/init.d/nginx start

现在我们可以通过 http://主机IP/ 来查看 Nginx 默认页面。

(3)、配置 HTTPS 反向代理

修改 /etc/nginx 目录的读写权限:

sudo chmod a+rw /etc/nginx

在 /etc/nginx/conf.d 目录创建 ssl.conf 文件:

cd /etc/nginx/conf.d
sudo touch ssl.conf
sudo chmod a+rw ssl.conf

将 ssl.conf 文件修改为如下内容(关于详细的 SSL 证书申请和配置请看这篇文章):

# 让 Nginx 代理支持 WebSocket 的配置
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
        listen 443;
        server_name www.example.com; # 改为绑定证书的域名

        # ssl 配置
        ssl on;
        ssl_certificate sshh.pem; # 改为自己申请得到的 crt 文件的名称
        ssl_certificate_key sshh.key; # 改为自己申请得到的 key 文件的名称
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        # WebSocket 配置
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # 反向代理
        location / {
            proxy_pass http://127.0.0.1:8765;
            # 8765 是刚刚通过 config.js 设置的通过 Node.js 构建的 Web App 的端口,可以使用 http://你的域名:8765/ 来查看,Nginx 代理以后,就可以直接使用 https://你的域名/ 来查看了
        }
    }

最后,我们运行入口文件:

pm2 start app.js

让 Nginx 重新加载配置使其生效:

sudo nginx -s reload

最终效果:

未分类

引用

大部分资料源于腾讯开发者实验室,我只是根据个人理解做了注释和顺序修改,所以,要感谢腾讯咯。

这篇文章花的时间很长,改动也非常多,如有错误,敬请指正!

CentOS 7 yum快速安装MongoDB

MongoDB是深受广大开源爱好者支持和研究的NoSQL数据库之一,它基于灵活的JSON文档方式,非常适合敏捷开发,其高可用功能强大,支持水平扩展等众多关键特性。一如其简约而不简单的MySQL一样,安装起来也非常方便,支持源码编译安装,rpm安装以及yum安装等众多方式。本文主要讲述在CentOS 7下yum方式快速安装mongodb。

一、安装环境及配置yum

    # more /etc/redhat-release 
    CentOS Linux release 7.2.1511 (Core)

    # vi /etc/yum.repos.d/mongodb-org-3.2.repo 
    [mongodb-org-3.2]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

二、安装MongoDB

    # yum -y install mongodb-org     
    Loaded plugins: fastestmirror, langpacks                     
    base                                                              | 3.6 kB  00:00:00     
    epel/x86_64/metalink                                              | 5.2 kB  00:00:00     
    extras                                                            | 3.4 kB  00:00:00     
    mongodb-org-3.2                                                   | 2.5 kB  00:00:00     
    updates                                                           | 3.4 kB  00:00:00     
    mongodb-org-3.2/7/primary_db                                      |  50 kB  00:00:03     
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * epel: mirrors.tuna.tsinghua.edu.cn
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    Resolving Dependencies
    --> Running transaction check
    ---> Package mongodb-org.x86_64 0:3.2.10-1.el7 will be installed
    --> Processing Dependency: mongodb-org-tools = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Processing Dependency: mongodb-org-shell = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Processing Dependency: mongodb-org-server = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Processing Dependency: mongodb-org-mongos = 3.2.10 for package: mongodb-org-3.2.10-1.el7.x86_64
    --> Running transaction check
    ---> Package mongodb-org-mongos.x86_64 0:3.2.10-1.el7 will be installed
    ---> Package mongodb-org-server.x86_64 0:3.2.10-1.el7 will be installed
    ---> Package mongodb-org-shell.x86_64 0:3.2.10-1.el7 will be installed
    ---> Package mongodb-org-tools.x86_64 0:3.2.10-1.el7 will be installed
    --> Finished Dependency Resolution

    Dependencies Resolved

    ===================================================================================================
     Package                                      Arch     Version             Repository         Size
    ===================================================================================================
    Installing:
     mongodb-org                                  x86_64   3.2.10-1.el7        mongodb-org-3.2   5.8 k
    Installing for dependencies:
     mongodb-org-mongos                           x86_64   3.2.10-1.el7        mongodb-org-3.2   5.6 M
     mongodb-org-server                           x86_64   3.2.10-1.el7        mongodb-org-3.2    12 M
     mongodb-org-shell                            x86_64   3.2.10-1.el7        mongodb-org-3.2   6.7 M
     mongodb-org-tools                            x86_64   3.2.10-1.el7        mongodb-org-3.2    41 M

    Transaction Summary
    ===================================================================================================
    Install  1 Package (+4 Dependent packages)

    Total download size: 65 M
    Installed size: 201 M
    Downloading packages:
    warning: /var/cache/yum/x86_64/7/mongodb-org-3.2/packages/mongodb-org-3.2.10-1.el7.x86_64.rpm: 
            Header V3 RSA/SHA1 Signature, key ID ea312927: NOKEY  ]  
    Public key for mongodb-org-3.2.10-1.el7.x86_64.rpm is not installed
    (1/5): mongodb-org-3.2.10-1.el7.x86_64.rpm                                  | 5.8 kB  00:00:04     
    (2/5): mongodb-org-server-3.2.10-1.el7.x86_64.rpm                           |  12 MB  00:00:11     
    (3/5): mongodb-org-shell-3.2.10-1.el7.x86_64.rpm                            | 6.7 MB  00:00:06     
    (4/5): mongodb-org-tools-3.2.10-1.el7.x86_64.rpm                            |  41 MB  00:00:36     
    (5/5): mongodb-org-mongos-3.2.10-1.el7.x86_64.rpm                           | 5.6 MB  00:03:28     
    ---------------------------------------------------------------------------------------------------
    Total                                                              322 kB/s |  65 MB  00:03:28     
    Retrieving key from https://www.mongodb.org/static/pgp/server-3.2.asc
    Importing GPG key 0xEA312927:
     Userid     : "MongoDB 3.2 Release Signing Key <[email protected]>"
     Fingerprint: 42f3 e95a 2c4f 0827 9c49 60ad d68f a50f ea31 2927
     From       : https://www.mongodb.org/static/pgp/server-3.2.asc
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : mongodb-org-tools-3.2.10-1.el7.x86_64                                    1/5 
      Installing : mongodb-org-mongos-3.2.10-1.el7.x86_64                                   2/5 
      Installing : mongodb-org-shell-3.2.10-1.el7.x86_64                                    3/5 
      Installing : mongodb-org-server-3.2.10-1.el7.x86_64                                   4/5 
      Installing : mongodb-org-3.2.10-1.el7.x86_64                                          5/5 
      Verifying  : mongodb-org-server-3.2.10-1.el7.x86_64                                   1/5 
      Verifying  : mongodb-org-3.2.10-1.el7.x86_64                                          2/5 
      Verifying  : mongodb-org-shell-3.2.10-1.el7.x86_64                                    3/5 
      Verifying  : mongodb-org-mongos-3.2.10-1.el7.x86_64                                   4/5 
      Verifying  : mongodb-org-tools-3.2.10-1.el7.x86_64                                    5/5 

    Installed:
      mongodb-org.x86_64 0:3.2.10-1.el7                                                                                                                                                                           

    Dependency Installed:
      mongodb-org-mongos.x86_64 0:3.2.10-1.el7      #Author : Leshami      
      mongodb-org-server.x86_64 0:3.2.10-1.el7      #Blog   : http://blog.csdn.net/leshami
      mongodb-org-shell.x86_64 0:3.2.10-1.el7           
      mongodb-org-tools.x86_64 0:3.2.10-1.el7          

    Complete!

三、验证安装结果

    # rpm -qa |grep mongodb
    mongodb-org-3.2.10-1.el7.x86_64
    mongodb-org-mongos-3.2.10-1.el7.x86_64
    mongodb-org-shell-3.2.10-1.el7.x86_64
    mongodb-org-server-3.2.10-1.el7.x86_64
    mongodb-org-tools-3.2.10-1.el7.x86_64

    # rpm -ql mongodb-org-server
    /etc/init.d/mongod
    /etc/mongod.conf
    /etc/sysconfig/mongod
    /usr/bin/mongod
    /usr/share/doc/mongodb-org-server-3.2.10
    /usr/share/doc/mongodb-org-server-3.2.10/GNU-AGPL-3.0
    /usr/share/doc/mongodb-org-server-3.2.10/MPL-2
    /usr/share/doc/mongodb-org-server-3.2.10/README
    /usr/share/doc/mongodb-org-server-3.2.10/THIRD-PARTY-NOTICES
    /usr/share/man/man1/mongod.1
    /var/lib/mongo
    /var/log/mongodb
    /var/log/mongodb/mongod.log
    /var/run/mongodb

    [root@localhost ~]# /etc/init.d/mongod start
    Starting mongod (via systemctl):                           [  OK  ]
    [root@localhost ~]# netstat -nltp|grep mongo
    tcp        0      0 127.0.0.1:27017      0.0.0.0:*   LISTEN      89958/mongod

    # mongo
    MongoDB shell version: 3.2.10
    connecting to: test
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
            http://docs.mongodb.org/
    Questions? Try the support group
            http://groups.google.com/group/mongodb-user
    &gt; db.version()
    3.2.10

未分类

MongoDB shell常用操作

shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用javascript脚本完成操作的。使用shell 命令,需要启动mongo.exe。

常用shell命令如下:

1、查询本地所有数据库名称

> show dbs;

2、切换至指定数据库环境(若无指定的数据库,则创建新的库)

> use mydb;

3、查询当前库下的所有聚集集合collection(相当于table)

> show collections;

4、创建聚集集合

> db.createCollection('mycollection');

5、查询聚集集合中数据条数

> db.mycollection.count();

6、插入数据

> db.mycollection.insert({'username':'xyz_lmn','age':26,'salary':120});

往’mycollection’聚集集合中插上一条数库,name为’xyz_lmn’,age为’26’,salary为’120′

7、查询age等于26的数据

> db.mycollection.find({"age":26});

8、查询salary大于100的数据

> db.mycollection.find({salary:{$gt:100}});

9、查询age小于30,salary大于100的数据

> db.mycollection.find({age:{$lt:30}},{salary:{$gt:100}});

10、查询salary小于40或salary大于200的数据

> db.mycollection.find({$or: [{salary: {$lt:40}}, {salary: {$gt:200}}]});

11、查询指定列的数据

> db.mycollection.find({},{age:1,salary:1});

1表示显示此列的意思,也可以用true表示

12、查询username中包含’e’的数据

> db.mycollection.find({username:/e/});

13、查询以a打头的数据

> db.mycollection.find({username:/^a/});

14、查询age列数据,并去掉重复数据

> db.mycollection.distinct('age');

15、查询前10条数据

> db.mycollection.find().limit(10);

16、查询1条以后的所有数据

> db.mycollection.find().skip(1);

17、查询第一条数据

> db.mycollection.findOne();

18、查询结果集的记录数(查询salary小于40或大于100的记录数)

db.mycollection.find({$or: [{salary: {$lt:40}}, {salary: {$gt:100}}]}).count();

19、按salary升序排序

> db.mycollection.find().sort({salary:1});

按照salary字段升序排序

20、降序

> db.mycollection.find().sort({salary:-1});

按照salary字段降序排序

21、根据username修改age

> db.employee.update({username:'jim'},{$set:{age:22}},false,true);
db.collection.update( criteria, objNew, upsert, multi )
  • criteria : update的查询条件,类似sql update查询内where后面的

  • objNew : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的

  • upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  • multi : MongoDB默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

22、将指定username的age字段增加5

> db.mycollection.update({username:'jim'},{$inc:{age:5}},false,true);

将username为‘jim’的age字段加5

23、删除username为’rose’的数据

> db.mycollection.remove({uname:'rose'});

24、集合collection重命名

> db.mycollection.renameCollection('c_temp');

将mycollection集合重命名为’c_temp’

25、删除集合

> db.c_temp.drop();

删除名为’c_temp’的集合

26、删除当前数据库

> db.dropDatabase();

未分类

MongoDB如何添加用户

  1. 不需要验证启动mongodb
  2. 添加用户

创建用户

db.createUser({
    user: 'testname',  // 用户名
    pwd: 'testpwd', // 密码
    roles: [
        {
            role: 'readWrite', // 读写权限
            db: 'test'  // 所属数据库
        }
    ]
})

需要验证启动MongoDB

mongod --dbpath mongoData --auth
show dbs // 报错,因为没有验证
use test // 切换到test数据库
db.auth('testname', 'testpwd') // 1
show collections // 可以查看表
use local // 切换到local数据
show collections // 报错
db.auth('testname', 'testpwd') // 报错,因为testname是test数据的用户

需要了解的概念:

  1. mongodb可以同时存在多个数据库。

  2. mongodb的用户是属于某个数据库的。即,你创建的某个用户只能在一数据库中使用。

  3. mongodb启动有两种模式,需要验证和不需要验证。默认不需要验证,当你使用验证模式启动后,对数据的所有操作必须通过验证并且具有相应权限才可以操作。

修改密码

use test // 切换到test数据库
db.auth('testname', 'testpwd') // 验证
db.changeUserPassword('testname', 'newtestpwd') // 修改密码

配置及测试mongodb副本集

mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。选举还有个前提条件,参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。因此,官方推荐我们的副本集机器数量至少为3个:一个主节点,两个副本节点。当然,mongodb副本集中可以有很多类型的节点,其中有一个仲裁节点,即当参与选举的节点无法选出主节点时仲裁节点充当仲裁的作用。仲裁节点不存储数据,只是仲裁。所以,我们的副本集可以设置为:1主+1从+1仲裁。

那么我们准备3台服务器:192.168.198.224(主),192.168.198.225(从),192.168.198.226(仲裁)。

1、分别在每台机器上下载解压mongodb安装包

curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.4.6.tgz
tar -zxvf mongodb-linux-x86_64-amazon-3.4.6.tgz
mv mongodb-linux-x86_64-amazon-3.4.6/ /usr/local/mongodb

2、分别在每台机器上创建mongodb的data、log以及配置目录

cd /usr/local/mongodb
mkdir -p data/db
mkdir log
touch log/mongod.log
mkdir etc
touch etc/mongod.conf

3、分别在每台机器上配置config文件

vim etc/mongod.conf

为了启动方便,我们可以将mongodb的启动配置项直接在配置文件中:

dbpath = /usr/local/mongodb/data/db        # 指定数据库路径
logpath = /usr/local/mongodb/log/mongod.log          # 指定mongodb日志文件
logappend = true        # 使用追加的方式写日志
port = 27017               #设置端口号为27017
fork = true                   #设置以守护进程的方式启动mongod
replSet = myrs            #设置副本集的名字为myrs,同一副本集群的replSet名称必需相同

4、分别在每台机器上启动副本集

cd /usr/local/mongodb
./bin/mongod -f ./etc/mongod.conf    #指定以mongod.conf配置启动mongod

5、初始化副本集

登录任意一台机器的mongodb后台管理shell:

cd /usr/local/mongodb
./bin/mongo
use admin
config = {
"_id":"rs0",
"members":[
  {"_id":0,"host":"192.168.198.223:27017"},
  {"_id":1,"host":"192.168.198.225:27017"},
  {"_id":2,"host":"192.168.198.226:27017",arbiterOnly:true}
]
}
rs.initiate(config);   #初始化配置

注意:如果执行rs.initiate(config)报错,那么我们需要检查三台服务器的防火墙27017端口是否开放。 如果没有问题,我们可以查看集群节点:

rs.status();

至此,整个副本集已经搭建成功了。
那么,我们可以测试一下副本集的基本功能:

1、测试副本集的数据复制功能

此时在我的机器上192.168.198.224是主节点,我们用mongo来登录shell。

cd /usr/local/mongodb
./bin/mongo
use test  #创建test数据库
db.testdb.insert({"name":"yaya"});       #插入数据

我们用副本节点登录shell,我这里是192.168.198.225:

cd /usr/local/mongodb
./bin/mongo
use test
show tables

此时会报错:

[thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} 

因为mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。

myrs:SECONDARY> db.getMongo().setSlaveOk();

此时就可以读取数据了:

repset:SECONDARY> db.testdb.find();

控制台输出:{ “_id” : ObjectId(“59676d711881041abab44477”), “name” : “yaya” }
所以,数据复制的功能是可用的。

2、测试副本集的故障转移功能

将主节点192.168.198.224的mongod进程杀死:

myrs:PRIMARY> use admin
myrs:PRIMARY> db.shutdownServer()

此时可以看到,192.168.198.225原本是副节点,此时自动转换为主节点。可以通过rs.status()来查看。

MongoDB数据库文档操作示例

前面的话

本文将详细介绍MongoDB数据库关于文档的增删改查

插入文档

  要将数据插入到 MongoDB 集合中,需要使用 MongoDB 的 insert()或save()方法,还有insertOne()或insertMany()方法

【insert()】

insert()命令的基本语法如下

db.COLLECTION_NAME.insert(document)

在插入的文档中,如果不指定_id参数,那么 MongoDB 会为此文档分配一个唯一的ObjectId。_id为集合中的每个文档唯一的12个字节的十六进制数

如果数据库中不存在集合,则MongoDB将创建此集合,然后将文档插入到该集合中

未分类

要在单个查询中插入多个文档,可以在insert()命令中传递文档数组

未分类

可以使用js语法,插入多个文档

未分类

【save()】

插入文档也可以使用db.post.save(document)。 如果不在文档中指定_id,那么save()方法将与insert()方法一样自动分配ID的值。如果指定_id,则将以save()方法的形式替换包含_id的文档的全部数据。

也就是说save()方法和insert()方法的区别是,save()方法可以复写或修改,而insert()方法不可以

db.post.save(document)

未分类

未分类

【insertOne()】

使用db.collection.insertOne()方法可以将单个文档插入到集合中

未分类

【insertMany()】

  使用db.collection.insertMany()方法可以将多个文档插入到集合中

未分类

查询文档

【find()】

  要从MongoDB集合查询数据,需要使用MongoDB的find()方法,默认返回结果中的前20条文档,输入”it”显示接下来的20条文档。

  find()命令的基本语法如下:

db.COLLECTION_NAME.find(document)

  find()方法将以非结构化的方式显示所有文档

未分类

  可以限定查询条件

未分类

  可以通过find 的第二个参数来指定返回的键,值为1或true表示显示该键,值为0或false表示不显示该键

未分类

  find()方法下的count()方法可以显示符合条件的文档数量

未分类

【findOne()】

  findOne()方法只返回一个文档,该文档是最早被添加的文档

未分类

【比较操作符】

小于        {<key>:{$lt:<value>}}    
小于或等于    {<key>:{$lte:<value>}}    
大于        {<key>:{$gt:<value>}}    
大于或等于    {<key>:{$gte:<value>}}    
不等于      {<key>:{$ne:<value>}}
等于        {<key>:{$eq:<value>}}

  取得x小于2的值

未分类

  取得x大于等于2的值

未分类

  取得x不等于2的值

未分类

【逻辑操作符】

  可以使用逻辑操作符and、and、or来表示与、或

 { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }

未分类

【正则表达式】

  文档查询可以使用正则表达式,但只支持字符串类型的数据

未分类

【$where】

  $where操作符功能强大而且灵活,它可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数

未分类

  使用字符串

未分类

  使用函数

未分类

限制与跳过
【limit()】

  如果需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数

  默认返回结果中的前20条文档,输入”it”显示接下来的20条文档

  如果没有指定limit()方法中的参数则显示集合中的所有数据

db.COLLECTION_NAME.find().limit(NUMBER)

未分类

【skip()】

  可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数

db.COLLECTION_NAME.find().skip(NUMBER)

未分类

排序
【sort()】

  在MongoDB中使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列

db.COLLECTION_NAME.find().sort({KEY:1})

未分类

更新文档
  MongoDB 使用update()或save()方法来更新集合中的文档

【update()】

  update() 方法用于更新已存在的文档。语法格式如下:

db.collection.update(<query>,<update>,{upsert:<boolean>, multi: <boolean>,writeConcern:<document>})
query : update的查询条件,类似sql update查询内where后面的
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern :可选,抛出异常的级别

 
 [注意]经过测试,upsert参数无法设置为true或者false,都可以插入新的字段

未分类

  mongodb默认只更新找到的第一条记录,将x:1,更新为x:10

未分类

  要特别注意的是,如果不使用$set,则将文档的内容替换为x:10

未分类

  更新全部记录,将x:10,更新为x:1

未分类

  mongodb默认只添加到更新找到的第一条记录,将x:1的记录,添加z:1

未分类

  将找到的x:2的全部记录,添加z:2

未分类

【save()】

  save()方法可以插入或更新文档,如果参数中的文档的_id与集合中所存在的_id都不同,则插入;如果相同,则更新

未分类

删除文档

  MongoDB remove()函数是用来移除集合中的数据

【remove()】

  默认地,mongodb删除符合条件的所有文档

db.collection.remove(<query>,{justOne: <boolean>, writeConcern: <document>})
query :删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档。
writeConcern :(可选)抛出异常的级别。

  只删除符合条件的第一个文档 

未分类

  删除符合条件的所有文档 

未分类

创建MongoDB Docker镜像

简介

本文我们准备学习如何构建MongoDB Docker镜像。以及如何推送镜像到Docker Hub registr和与其他人共享。
使用docker和容器部署mongodb实例有几个好处:

  • 易于维护,高度可配置的MongoDB实例
  • 毫秒级运行和启动
  • 可共享镜像
  • 创建MongoDB Dockerfile

    我们来创建Dockerfile并开始构建它:
    以下说明的可选的,不过在Dockerfile开头添加注释可以说明它的目的:

    1. # Dockerizing MongoDB: Dockerfile for building MongoDB images
    2.     # Based on ubuntu:latest, installs MongoDB following the instructions from:
    3.     # http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

    我们使用从Docker Hub最新的Ubuntu版本来构建镜像。

    1. # Format: FROM    repository[:version]
    2. FROM       ubuntu:latest

    然后声明此Dockerfile的维护者:

    1. # Format: MAINTAINER Name <[email protected]>
    2. MAINTAINER M.Y. Name <[email protected]>

    导入MongoDB公共GPG密钥。然后创建一个MongoDB仓库文件。

    1. # Installation:
    2. # Import MongoDB public GPG key AND create a MongoDB list file
    3. RUN apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10
    4. RUN echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.0.list

    完成这些初始准备后我们就可以更新软件包并安装MongoDB。

    1. # Update apt-get sources AND install MongoDB
    2. RUN apt-get update && apt-get install -y mongodb-org

    MongoDB需要一个数据目录。

    1. # Create the MongoDB data directory
    2. RUN mkdir -p /data/db

    最后设置ENTRYPOINT来让docker从镜像运行一个容器时执行这个ENTRYPOINT。对于端口,使用EXPOSE暴露。

    1. # Expose port 27017 from the container to the host
    2. EXPOSE 27017
    3.  
    4. # Set usr/bin/mongod as the dockerized entry-point application
    5. ENTRYPOINT ["/usr/bin/mongod"]

    构建MongoDB Docker镜像

    开始构建镜像。

    1. # Format: docker build –tag/-t <user-name>/<repository> .
    2. # Example:
    3. $ docker build –tag my/repo .

    推送MongoDB镜像到Docker Hub

    首先登录到docker hub。

    1. # Log-in
    2. $ docker login
    3.  
    4. Username:
    5. ..

    开始推送:

    1. # Push the image
    2. # Format: docker push <user-name>/<repository>
    3. $ docker push my/repo
    4.  
    5. The push refers to a repository [my/repo] (len: 1)
    6. Sending image list
    7. Pushing repository my/repo (1 tags)
    8. ..

    使用MongoDB镜像

    使用刚构建好的MongoDB镜像,我们可以运行一个或多个MongoDB实例。

    1. # Basic way
    2. # Usage: docker run –name <name for container> -d <user-name>/<repository>
    3. $ docker run -p 27017:27017 –name mongo_instance_001 -d my/repo
    4.  
    5. # Dockerized MongoDB, lean and mean!
    6. # Usage: docker run –name <name for container> -d <user-name>/<repository> –noprealloc –smallfiles
    7. $ docker run -p 27017:27017 –name mongo_instance_001 -d my/repo –smallfiles
    8.  
    9. # Checking out the logs of a MongoDB container
    10. # Usage: docker logs <name for container>
    11. $ docker logs mongo_instance_001
    12.  
    13. # Playing with MongoDB
    14. # Usage: mongo –port <port you get from `docker ps`>
    15. $ mongo –port 27017
    16.  
    17. # If using docker-machine
    18. # Usage: mongo –port <port you get from `docker ps`>  –host <ip address from `docker-machine ip VM_NAME`>
    19. $ mongo –port 27017 –host 192.168.59.103

    如果需要在一个主机运行多个实例,需要映射不同的端口。

    1. # Start two containers and map the ports
    2. $ docker run -p 28001:27017 –name mongo_instance_001 -d my/repo
    3.  
    4. $ docker run -p 28002:27017 –name mongo_instance_002 -d my/repo
    5.  
    6. # Now you can connect to each MongoDB instance on the two ports
    7. $ mongo –port 28001
    8.  
    9. $ mongo –port 28002

    Ubuntu 16.04 (Xenial)安装配置MongoDB

    MongoDB是一个数据库引擎,提供对非关系,面向文档的数据库的访问。 增长最快的NoSQL之一,旨在提供传统关系数据库管理系统(RDBMS)的替代方案。 除了无模式设计和可扩展架构之外,MongoDB还提供JSON输出和特定的语言特定绑定,使其特别适合在自定义应用程序开发中使用。 MongoDB已经用于许多大规模生产部署,并且是目前所有系统中最流行的数据库引擎之一。

    安装MongoDB

    从Ubuntu存储库安装MongoDB:

    1. sudo apt-get install mongodb-server

    配置MongoDB

    MongoDB的配置文件位于/etc/mongodb.conf。 大多数设置都在文件中有很好的注释,我们在下面列出了一些更重要的选项:
    dbpath表示存储数据库文件的位置(默认为/var/lib/mongodb)
    logpath表示MongoDB的日志所在的位置(默认为/var/log/mongodb/mongodb.log)
    logappend指示是否将新条目附加到日志的结尾,而不是在每次MongoDB重新启动后覆盖现有日志条目
    bind_ip指定MongoDB应侦听的IP地址。 通常建议将此默认设置为127.0.0.1(localhost),除非您有特定的理由将其托管到公共互联网。 这里指定0.0.0.0将导致MongoDB在所有网络接口上侦听。
    port指定默认网络端口27017,可以取消注释和修改
    默认情况下,当注释掉或未明确定义auth时将禁用认证。 要利用MongoDB的内部身份验证功能,请通过删除行开头处的#,并将值设置为true来取消注释auth选项。
    对MongoDB配置文件进行更改后,请重新启动服务,如下一节所示。

    启动和停止MongoDB

    要启动,重新启动或停止MongoDB服务,请从以下选项中执行适当的命令:

    1. sudo systemctl start mongodb
    2. sudo systemctl restart mongodb
    3. sudo systemctl stop mongodb

    创建数据库用户

    如果在“配置MongoDB”小节中启用了认证,请在数据库上创建一个管理员:
    1.运行mongodb命令打开shell:

    1. mongo

    2.默认情况下,MongoDB连接到一个名为test的数据库。 在添加任何用户之前,创建数据库以存储用于验证的用户数据:

    1. use admin

    3.使用以下命令创建能够在任何数据库上创建其他用户的管理用户。

    1. db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})

    将这些凭证保存在安全的地方,以备将来参考。 输出将显示写入数据库的所有信息,密码除外:
    Successfully added user: {
    “user” : “mongo-admin”,
    “roles” : [
    {
    “role” : “userAdminAnyDatabase”,
    “db” : “admin”
    }
    ]
    }
    4.退出mongo终端

    1. quit()

    5.使用在步骤3中创建的凭据,使用admin数据库进行身份验证来测试与MongoDB的连接:

    1. mongo -u mongo-admin -p –authenticationDatabase admin

    为了验证与shell的连接,需要上述命令中的-u和-p –authenticationDatabase选项。 没有身份验证,MongoDB shell可以被访问,但它不允许连接到数据库。
    在步骤3中创建的mongo-admin用户纯粹是基于指定的角色的管理。 它被定义为所有数据库的用户管理员,但本身没有任何数据库权限。 您可以使用它来创建其他用户并定义他们的角色。 如果您使用多个应用程序与MongoDB,设置不同的用户具有对应的数据库的自定义权限。
    6.作为mongo-admin用户,创建一个新的数据库来存储常规用户数据进行身份验证。 以下示例为user-data:

    1. use user-data

    不同数据库的权限在单独的角色对象中处理。 步骤7中的示例创建了用户example-user,对用户数据数据库具有只读权限,并且对我们将在下面的基本MongoDB函数部分中创建的示例数据库数据库具有读写权限。
    7.创建新的非管理用户以输入测试数据。

    1. db.createUser({user: "example-user", pwd: "password", roles:[{role: "read", db: "user-data"}, {role:"readWrite", db: "example-db"}]})

    基本的MongoDB函数

    MongoDB之所以欢迎大多数得益于易于集成。 通过JavaScript函数与数据库进行交互,并提供其他语言的驱动程序。 本节将演示一些基本功能,但我们建议您根据特定的用例进行进一步的研究。
    1.使用我们上面创建的example-user打开MongoDB shell:

    1. mongo -u example-user -p –authenticationDatabase user-data

    2.创建新数据库example-db:

    1. use example-db

    请确保此数据库名称对应于用户具有读取和写入权限的数据库名称。
    要显示当前工作数据库的名称,请运行db命令。
    3.创建用于输入测试数据库的样本数据。 MongoDB接受输入为JSON对象形式的文档,如下面的那些。 a和b变量用于简化输入; 对象也可以通过函数直接插入。

    1. var a = { name : "John Doe" }
    2. var b = { age : 30 }

    4.使用insert函数将数据插入到名为example的集合中。 如果您不熟悉MongoDB术语,则可以将集合视为与关系数据库管理系统中的表。

    1. db.example.insert(a)
    2. db.example.insert(b)

    每个操作的输出将显示成功写入当前工作数据库的对象数:

    1. WriteResult({ "nInserted" : 1 })

    5.确认example集合已经被创建

    1. show collections

    输出将列出包含当前工作数据库中的数据的所有集合:

    1. example
    2. system.indexes

    在这种情况下,example是我们创建的集合,而system.indexes是一个自动创建的索引集合,供MongoDB内部使用。
    6.使用find函数查看example集合中的所有数据。 此函数还可用于通过输入搜索项参数来搜索特定字段:

    1. db.example.find()

    输出将类似于以下内容:
    { “_id” : ObjectId(“571a3e7507d0fcd78baef08f”), “name” : “John Doe” }
    { “_id” : ObjectId(“571a3e8707d0fcd78baef090”), “age” : 30 }