一:与MySQL区别
RDBMS 与 MongoDB 对应的术语:
类似于mysql,刚开始数据库、集合都是要创建之后才有的。
但是每次插入数据时都是插入一个对象,整个对象就是文档,对象的属性名就是字段。字段是不需在提前创建时声明的,每次插入文档时随意添加的。
这点跟mysql还是有较大差别的,mysql在创建表格时需要指定有哪些列。插入数据时也要严格根据列名顺序填写。mongodb在创建集合时不需要声明有哪些字段,插入文档时也可以随意插入对象。
二:window安装mongodb
下载地址:https://www.mongodb.com/download-center#community
下载.msi,点击安装即可,安装过程可能会很久,我两次都是安装一夜。如果安装太久中间打断好像也不影响安装。具体安装可看如下链接:
windows下MongoDB的安装及配置 - CSDN博客
总结如下:
1.安装;
2.然后建db文件夹里面放data文件夹,配置db这个文件地址;
3.建log文件夹建config文件写文件内容,配置文件地址;
4.使用mongdb(mongodb安装目录bin下双击mongo.exe)
5.双击exe文件后会弹出cmd框,在框里操作数据库就行
新版4.0的mongodb自动配置了以上内容,无需再手动配置
Mac版的默认安装目录在usr下面,默认是隐藏的。需要在全局搜索里找到,打开finder。按【command+shift+G】弹出对话框,搜索usr。usr/local/cellar/mongodb
三:linux安装Mongodb
安装/启动
1、按照这个链接的教程来 Linux 平台安装 MongoDB | 菜鸟教程
如果在执行安装语句,如下
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
提示 -bash: mongod: command not found,则到bin文件夹下执行
./mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
如果启动mongodb时报错。可参考本第八章节处理
然后到mongo文件夹下的bin文件下,执行./mongo。就可以操作数据库了
cd /usr/local/数据库文件名/bin
$ ./mongo
.....开始操作.....
2、yum安装
Centos 使用yum安装MongoDB 4.0
远程连接
Mongodb远程连接,连接前需要确认两件事:
a、防火墙是否关闭
b、配置远程连接,确认重启与配置是否成功
1、确认防火墙
ssh连接linux后,直接
systemctl status firewalld
Active: inactive (dead) 表示关闭状态
2、配置远程连接
mongodb默认只允许本地连接,远程连接需要配置。
开启服务时加上 --bind_ip_all 参数就会设置了可以远程连接,
开启前记得先干掉mongo的进程,再重新启动
查看 mongodb 进程 ps aux |grep mongodb
删除进程 kill 进程id(进程行第一串数字)
可用netstat -nltp来检查
netstat -nltp // 检测是否绑定ip成功
端口号为27017前面的ip是0.0.0.0而不是127.0.0.1表示正确
3、navicat登录
使用ssh方式登录,账号密码不是数据库的账号密码,是SSH的账号/密码
四:常用命令
mongo的操作命令有点像js的方法调用,具体如下
show dbs 显示所有数据库 (假如有个库叫test)
use test 使用(或创建)test数据库
show collections 显示所有集合(表) 假如有个集合叫runoob
db.runoob.find().pretty(); 读集合runoob里的所有文档(行) db不是指某个具体的数据库名字,就是db
db.runoob.findOne('5b2cc5ee4839f91d68b4bb2f'); 读取_Id 为‘xxxx’的数据
db.VisitList.find({ 'time': {'$gt': '2021/12/8', '$lt': '2021/12/9' }}) // time字段下两个时间段之间的数据
db.runoob.insert({name:'孙权'});
db.runoob.remove({'name':"孙权"}) 根据属性删除某些文档,删除name字段是孙权的所有文档
db.runoob.remove({}) 删除所有文档
db.runoob.remove({_id: {$in:['aID','bID']}}); //通过多个Id来删除
db.createCollection(name,options) 创建集合,options可选参数
db.runoob.update({'Title':'关于本博客'},{$set:{'CommentNum':0}}); 修改数据
db.createCollection(name) 创建数据表
db.TabelName.deleteMany({"Age":50}) //TabelName数据表名 删除年龄Age字段为50岁的列
db.表名.update({},{$unset:{'字段名':''}},false, true) // 删除字段
常用操作语句
1、排序
db.getCollection('表名').find({}).sort({字段:-1}) // 倒序
五:node操作数据库
排序的话使用sort,可以根据指定字段排序;如果只是倒序和正序的切换可以直接根据_id字段来排序。
如下为常用的node操作数据库的方法封装
// 连接数据库
var MongoClient = require("mongodb").MongoClient
, assert = require('assert');
var Url = "mongodb://localhost:27017/";
/**
* 操作数据库 比较全面的封装
* @param Collection 要操作的表名
* @param Type 要操作的类型,比如增删改查直接操作库
* @param data 如果是只有一个参数,则直接传递该参数;如果有两个参数,传递数组
* @param CallBack 操作成功的回调函数
* @constructor
*/
function Mongo(Collection,Type, data, CallBack) {
MongoClient.connect(Url, function (err, db) {
var DB = db.db("snake");
if (Type == 'Insert') {
DB.collection(Collection).insertOne(data, function (err, res) {
if(err) throw err;
db.close();
CallBack(res);
});
} else if (Type == 'Delete') {
DB.collection(Collection).deleteOne(data,function (err,res) {
if(err) throw err;
db.close();
CallBack(res);
});
} else if (Type == 'Read') {
DB.collection(Collection).find(data).toArray(function (err, res) {
if(err) throw err;
db.close();
CallBack(res);
});
} else if(Type == 'Update'){
DB.collection(Collection).updateOne(data[0],data[1],function (err,res) {
if(err) throw err;
db.close();
CallBack(res);
})
// 获取列表数量
}else if(Type == 'GetNum'){
DB.collection(Collection).find(data).toArray(function (err, res) {
if(err) throw err;
db.close();
CallBack(res.length);
});
// 获取排序后的列表
}else if(Type == 'ReadByOrder'){
if(data[2]){
DB.collection(Collection).find(data[0]).sort(data[1]).skip(data[2].Skip).limit(data[2].Limit).toArray(function (err, res) {
if(err) throw err;
db.close();
CallBack(res);
});
}else {
DB.collection(Collection).find(data[0]).sort(data[1]).toArray(function (err, res) {
if(err) throw err;
db.close();
CallBack(res);
});
}
}else if(Type == 'MulDelete'){
DB.collection(Collection).remove(data,function (err,res) {
if(err) throw err;
db.close();
CallBack(res);
});
}
});
}
使用上面的方法:
// 获取排序后的,根据分页数据请求的列表
var PagnationData = Para.PagnationData ? Para.PagnationData : {SKip: 0, Limit: 1000};
Monge.Mongo('score', 'ReadByOrder', [{}, {_id: -1}, PagnationData], function (Result) {
var Json = {status: '0', data: Result};
Response.json(Json);
});
// 单个删除
var Object = {};
Object._id = ObjectId(Para._id);
Monge.Mongo('score', 'Delete', Object, function () {
var Json = {status: '0', data: '标签删除成功'};
Response.json(Json);
});
// 批量删除
var Object = {};
Para.idArray.forEach(function (item,i) { // Para.idArray为接收的参数,是个存的id的数组
Para.idArray[i] = ObjectId(item); //
});
Object._id = {
$in: Para.idArray
};
Monge.Mongo('score', 'MulDelete', Object, function () {
var Json = {status: '0', data: '批量删除成功'};
Response.json(Json);
});
六:导出mongodb数据库
主要以下三点:
1.一次只能导出一个集合,且必须选择一个集合
2.集合中具体的字段可以不写
3.必须在bin文件夹下,运行命令行
mongoexport -d test -c runoob -o C:\Mongodb\runoob.json --type json
导入比较简单,如下:
mongoimport -d test -c Users --file C:\dbs\runoob.json
macos下,导出集合
mongoexport -d test -c Tags -o /Users/sunquan/Mongodb/Tags.json --type json
七:Mongodb数据导出成Excel
Mongodb原生支持导出数据为csv文件,excel可以直接打开该文件。如果一定需要用excel格式的文件,可以建一个excel文件,然后把csv文件中的数据拷贝进去。
在Mongdb的安装目录下的bin文件夹中执行语句:
mongoexport -d 库名 -c 表名 -f 字段1,字段2 --csv -o 路径及文件名
举个栗子:
C:\Program Files\MongoDB\Server\4.0\bin>
mongoexport -d onlyfudai -c Form -f UserName,UserPhone,
GiftArray,IdentCode --csv -o ./user.csv
八:可视化工具
因为之前使用mysql时,用的navicat数据库可视化工具。于是惯性思维就用navicat链接操作mongodb,navicat确实非常方便,怎奈我没钱买正版。破解的办法,动不动就失效。。。
后来发现有专门为mongodb打造的可视化工具:Robo 3T。免费,方便,功能强大,推荐给大家避免走我的弯路。具体长下面这个样子
九:注意事项
1、查询时间范围时时间格式需要规范
db.VisitList.find({'time':{'$gt':'2021/12/07','$lt':'2021/12/09'}})// time字段下两个时间段之间的数据
如果两个时间格式误写为:(2021/12/7 到2021/12/9)或者(2021/12/9 到2021/12/10)是会查询不到记录的,注意月日都是两位。
十:具体问题
1、/lib64/libc.so.6: version `GLIBC_2.18' not found
在使用 MongDB,GLIBC_2.18 缺失,按照如下命令执行,途中不要退出.
curl -O http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxf glibc-2.18.tar.gz
cd glibc-2.18/
mkdir build
cd build/
../configure --prefix=/usr
make -j2
make install
十一:实践
我自己写了一个博客,后端语言用的Node.js,数据库搭配使用Mongodb。
后端接口有关于mongodb的操作封装,分享给大家,欢迎大家指正
博客前端展示:孙权的个人网站
博客后端源码:GitHub地址