MongoDB

2017-12-12

下载地址:https://www.mongodb.com/try/download/community

WSL2下安装MongoDB 6.x

0.使用以下命令安装gnupg及其所需的库

apt-get install gnupg

1.导入包管理系统使用的公钥

wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -

2.为MongoDB创建一个列表文件

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

3.重新加载本地包数据库

apt-get update

4.安装MongoDB包

apt-get install -y mongodb-org

5.配置文件位置

/etc/mongod.conf

6.启动脚本

/root/startup.sh

#!/bin/bash
ulimit -SHn 65535
mongod -f /etc/mongod.conf -fork

优雅的关闭

mongod -f /etc/mongod.conf --shutdown

7.Windows启动脚本

c:/auto_run/startup/start.bat

wsl -d Ubuntu -u root /root/startup.sh

8.Windows启动调用

shell:startup /startup.vbs

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "C:\auto_run\startup\start.bat /start",0

安装手册:https://www.mongodb.com/docs/manual/administration/install-on-linux/

代码段

查看今日爬虫状态

/*
* 查看今日爬虫状态
* BY: http://malu.me/
*/
var date = new Date();
var bb = date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate();
function getcount(){
    var collection_list = db.getCollectionInfos({"name":/BR_/});  // 列出前包含BR_的Collection
    for ( var i=0;i<collection_list.length;i++ ){
        table = collection_list[i]['name'];
        ok = db.getCollection(table).find({'product_info': {$ne:""},"date":bb,"source":"TB"}).count();
        no = db.getCollection(table).find({'product_info': "","date":bb,"source":"TB"}).count();
        print(table, ok+'/'+no);
    }
}
getcount();

PHP模糊查询 old

<?php
   // 连接到mongodb
   $m = new MongoClient("xxx.malu.me:123456");
   // 选择一个数据库
   $db = $m->mydb;
   // 认证登录
   $db->authenticate('username', 'passwd');
   // 选择一个表
   $collection = $db->user;
   $name = 'python';
   $query = array('title' => new MongoRegex("/.*".$name.".*/i"));
   $cursor = $collection->find($query);
   // 迭代显示文档标题
   // var_dump($cursor);
   foreach ($cursor as $document) {
      echo $document["title"] . "\n";
   }
?>

PHP mongoDB常用查询

<?php
//字段字串为
$querys = array"name"=>"malu");
//数值等于多少
$querys = array"number"=>7);
//数值大于多少
$querys = array"number"=>array'$gt' => 5));
//数值大于等于多少
$querys = array"number"=>array'$gte' => 2));
//数值小于多少
$querys = array"number"=>array'$lt' => 5));
//数值小于等于多少
$querys = array"number"=>array'$lte' => 2));
//数值介于多少
$querys = array"number"=>array'$gt' => 1'$lt' => 9));
//数值不等于某值
$querys = array"number"=>array'$ne' => 9));
//使用js下查询条件
$js ="function(){
return this.number == 2 && this.name == 'shian';
}";
$querys = array'$where'=>$js);
//字段等于哪些值
$querys = array"number"=>array'$in' => array1,2,9)));
//字段不等于哪些值
$querys = array"number"=>array'$nin' => array1,2,9)));
//使用正则查询
$querys = array"name"=>  new MongoRegex("/.*".$name.".*/i"));
//或
$querys = array'$or' => arrayarray'number'=>2),array'number'=>9)));
?>

语句

建立复合索引

db.getCollection("bolg").createIndex({"source":1,"date":-1});

1 为指定按升序创建索引

-1 为降序来创建索引

创建唯一索引,并消除重复数据。

数字1表示userid键的索引按升序存储,-1表示userid键的索引按照降序方式存储。

> db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true}) 

注:如果存在其他键,那么删除重复会失败,需要手动删除。

聚合查询,统计重复个数

> db.runCommand({"distinct":"table_name","key":"field_name"})

# 查看非重复值个数
> db.getCollection("table_name").distinct('field_name').length

# 找出指定字段重复数
> db.AI_online.aggregate([{$group : {_id : "$title", num : {$sum : 1}}},{$match :{num:{$gt : 1}}},{$sort:{num:-1}}])

# 删除指定字段重复值,只保留一个(去重)
> db.AI_online.aggregate([
{
    $group: { _id: {title: '$title'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
},
{
    $match: {count: {$gt: 1}}
}
]).forEach(function(doc){
    doc.dups.shift();
    db.AI_online.remove({_id: {$in: doc.dups}});
})

模糊查询

db.test_info.find({"tname": {$regex: '测试', $options:'i'}}) 

db.test_info.find({"tname": {$regex:/测试.*/i}})

模糊+或查询

db.test_info.find({"$or":[{"title":{$regex:/测试.*/i}},{"summary":{$regex:/测试.*/i}}]}) 

MongoDB运维

RPM安装

rpm -ivh https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-org-server-5.0.6-1.el7.x86_64.rpm  --force --nodeps

ubuntu安装5.x

wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
vim /etc/apt/sources.list.d/mongodb-org-5.0.list
apt update
apt-get install -y mongodb-org

服务启动与停止

systemctl start mongod
systemctl stop mongod

异常处理

日志报错:MongoDB之Too many open files

Linux是有文件句柄限制的,而且Linux默认一般都是1024

解决办法:把句柄限制提高

cat /proc/sys/fs/file-max     # file-max(系统级别)是设置系统所有进程一共可以打开的最大文件数量。
cat /etc/security/limits.conf # 永久配置文件(注意WSL2下这个值貌似没生效)
ulimit -n                     # 查看用户级的限制,阿里云服务器一般是65535
ulimit -a                     # 查看当前的各种用户进程限制
ulimit -SHn 65535             # 临时修改系统句柄限制,加-H就是硬限制,加-S就是软限制

mongo3.x老版本升级

如果以前有3.x版本,则需要先卸载老版本

使用 apt list --installed | grep mongo 查看历史版本

然后删除他们:

apt remove mongodb-server-core

参考文章:https://docs.mongodb.com/manual/reference/installation-ubuntu-community-troubleshooting/#unable-to-install-package-due-to-dpkg-deb–error

注意!!

mongod 版本3.x的配置文件和 5.x的有区别:

3.x默认使用 /etc/mongodb.conf

5.x默认使用 /etc/mongod.conf 的 yaml格式,注意格式区分!

开启密码登录:

1.添加用户

在终端下

use admin   // 进入admin库
db.createUser({
  user: 'admin',  // 用户名
  pwd: '123456',  // 密码
  roles:[{
    role: 'root',  // 角色
    db: 'admin'  // 数据库
  }]
})
show users  // 显示用户列表

2.配置文件开启验证 mongod.conf

security:
  authorization: enabled

2.1 或者启动的时候加上 –auth

mongodump常用参数说明

  • –db:指定导出的数据库
  • –collection:指定导出的集合
  • –excludeCollection:指定不导出的集合
  • –host :远程ip
  • –username:开启身份验证后,用户的登录名
  • –password:用户的密码
  • –out(指定输出目录):如果不使用这个参数,mongodump将输出文件保存在当前工作目录中名为dump的目录中
  • –archive:导出归档文件,最后只会生成一个文件
  • –gzip:压缩归档的数据库文件,文件的后缀名为.gz

mongodump和mongorestore来迁移数据库

官方说明书:https://docs.mongodb.com/database-tools/mongodump/

备份恢复本地全库:

mongodump -o /mongodbbackup/20220230/ --gzip
mongorestore --dir ./20220230/ --gzip

备份恢复单个collection

mongodump --uri="mongodb+srv://malu:xxxxx@malu.me" -d=spider_zujuan -c=questions --archive=spider_zujuan.gz --gzip
mongorestore --gzip --archive=spider_zujuan.gz -d=spider_zujuan -c=questions --uri="mongodb://192.168.50.2"

备份整个数据库脚本

#!/bin/bash
MY_PATH=$(cd "$(dirname "$0")"; pwd)
cd $MY_PATH
dd=`date '+%Y-%m-%d-%H%M%S'`
mongodump --uri="mongodb+srv://malu:xxxxx@malu.me" -o ./$dd --gzip
# mongorestore --dir ./20220230/ --gzip

迁移mongodb 3.4->3.6

可以采用直接拷贝数据库文件的方式进行。 拷贝文件需要停止数据库服务,停止后直接拷贝数据库文件目录中的数据即可。

注意事项:

1、.lock文件不要拷贝;
2、diagnostic.data的文件夹不要拷贝,如果拷贝,在新的数据库运行时会出现错误,需要修复,时间有点长。

快速安装

apt-get install mongodb
apt-get install mongodb-org

Linux下安装手册:https://docs.mongodb.com/manual/administration/install-on-linux/

启动

mongod -f /etc/mongodb.conf -fork   //使用配置文件启动,并后台执行

连接

mongo --host xx.xx.xx.xx --port 123

test数据库添加用户

use test
db.addUser("test","test")

登录

// 方式一
mongo
use admin
db.auth('admin', '123456')

// 方式二
mongo admin -u admin -p 123456

添加超级管理员

db.createUser(
  { user: "admin",
    pwd: "admin",
    roles: [ { role: "root", db: "admin" } ]
  }
)

user字段,为新用户的名字;

pwd字段,用户的密码;

roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色。在roles字段,可以指定内置角色和用户定义的角色。

内建的角色:

  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色:root
  7. 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  8. 内部角色:__system

角色参考:https://docs.mongodb.com/manual/reference/built-in-roles/#built-in-roles

修改超级管理员密码

db.changeUserPassword("admin", "654321")

添加DB读写用户

先建立一个DB,然后在该DB下执行shell:

db.createUser(
  { user: "spider",
    pwd: "spider",
    roles: [ { role: "readWrite", db: "spider" } ]
  }
)

windows下开启mongodb用户认证

修改配置文件:C:\Program Files\MongoDB\Server\3.4\mongod.cfg

添加:

security:
    authorization: enabled

然后重启服务

知识库

聚合

聚合参考文档 https://docs.mongodb.com/v5.0/reference/aggregation/

实用 MongoDB 聚合书 https://www.practical-mongodb-aggregations.com/

PHP

PHP Mongodb库手册

https://docs.mongodb.com/php-library/current/tutorial/

PHP Mongodb库官方文档

https://www.php.net/manual/zh/set.mongodb.php

Python

pymongo手册

https://pymongo.readthedocs.io/

https://www.w3schools.com/python/python_mongodb_insert.asp

CRUD

https://docs.mongodb.com/v5.0/crud/

windowns MongoDB 客户端

navicat-for-mongodb https://www.navicat.com/en/download/navicat-for-mongodb

MongoDB Compass 客户端 https://www.mongodb.com/try/download/compass

Robomongo https://robomongo.org/

studio3t https://studio3t.com/download-now/

windowns MongoDB server

下载地址:

https://www.mongodb.org/dl/win32/

安装教程:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/

mongodump、mongorestore等工具下载

https://www.mongodb.com/try/download/database-tools

MongoDB 数据库工具文档 https://docs.mongodb.com/database-tools/