MongoDB
noSQL ======= not only SQL
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它的特点:高性能、易部署、易使用,存储数据非常方便。
使用前操作:
下载>安装>设置环境变量
启动:
$mongod --dbpath <path> --logpath <path> --logappend --port 27017
$mongod --dbpath <path>
$mongod --dbpath <path> --fork
连接:
$mongo
查看所有数据库:
show dbs
查看当前连接的数据库:
db
切换数据库:
use yourdb
查看数据库的所有集合:
show collections
执行:
方式1:
mongo 命令行操作
方式2:
load(‘path’);
MongoDB 概念解析
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
数据库
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
集合
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
文档
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
数据类型
常用命令
-
Help查看命令提示
help
db.help()
db.test.help()
db.test.find().help()
-
创建/切换数据库
use <数据库名>
-
查询数据库
show dbs
-
查看当前使用的数据库
db/db.getName()
-
显示当前DB状态
db.stats()
-
查看当前DB版本
-
db.version()
-
查看当前DB的链接机器地址
db.getMongo()
-
删除数据库
db.dropDatabase()
Collection集合操作
-
创建一个集合
db.createCollection("collName", {size: 20, capped: true, max: 100}); db.collName.isCapped(); //判断集合是否为定容量
-
得到指定名称的集合
db.getCollection("account"); // db.account
-
得到当前db的所有集合
db.getCollectionNames(); //show collections
-
显示当前db所有集合的状态
db.printCollectionStats();
Document文档操作
-
添加
db.users.save({name: ‘zhangsan', age: 25, sex: true});
-
修改
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true); db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true); db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
-
删除
db.users.remove({age: 132});
-
查询所有记录
db.userInfo.find();
-
查询去重后数据
db.userInfo.distinct("name");
-
查询age = 22的记录
db.userInfo.find({"age": 22});
-
查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
-
age < 22的记录
db.userInfo.find({age: {$lt: 22}});
-
查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
-
查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
-
查询age >= 23 并且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
-
查询name中包含 mongo的数据
db.userInfo.find({name: /mongo/});
-
查询name中以mongo开头的
db.userInfo.find({name: /^mongo/});
-
查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
-
查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
-
按照年龄排序
升序:db.userInfo.find().sort({age: 1}); 降序:db.userInfo.find().sort({age: -1});
-
查询name = zhangsan, age = 22的数据
db.userInfo.find({name: 'zhangsan', age: 22});
-
查询前5条数据
db.userInfo.find().limit(5);
-
查询10条以后的数据
db.userInfo.find().skip(10);
-
查询在5-10之间的数据
db.userInfo.find().skip(5).limit(10);
page=1&count=10 skip=(page-1)*count limit=count 0~9 page=2&count=10 skip=(page-1)*count limit=count 10~19 offset=0&limit=10 skip=offset limit=limit 0~9 offset=10&limit=20 skip=offset limit=limit 10~29 offset=30&limit=8
-
or查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
-
查询第一条数据
db.userInfo.findOne();
-
查询某个结果集的记录条数
db.userInfo.find({age: {$gte: 25}}).count();
使用mongoose在Node.js操作MongoDB
安装
npm install mongoose -S
// 定义表格字段
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
age: {
type: Number,
min: 0,
max: 100
},
gender: {
type: String,
default: '男'
}
...
});
// 把表格转为一个js可以操作的类
// 参数1:collection的名字
// 参数2:collection的字段声明
const User = mongoose.model('user', userSchema);
// 连接数据库
mongoose.connect('mongodb://localhost:27017/project', {useNewUrlParser: true}, async (error)=>{
if(error) throw error;
console.log('连接成功');
}
增删改查 数据库操作三种写法(数据库操作为异步操作,不能直接写在外面)
// 新增
const zhangsan = new User({
name: '张三',
age: 40
});
//保存
1、回调函数
zhangsan.save((error, result)=>{
console.log(error);
console.log(result);
});
2.promise
zhangsan.save()
.then(result=>{
console.log(result);
})
.catch(error=>{
console.log(error);
})
3.try{}catch{}
try{
const result = await zhangsan.save();
}
catch(error){
console.log(error);
}
```js
// 新增
// new User().save();
/* // 删除
User.findByIdAndRemove()
User.findByIdAndDelete()
User.findOneAndDelete()
User.findOneAndRemove()
User.deleteMany()
User.deleteOne()
*/
/* // 更新
User.findByIdAndUpdate()
User.findOneAndUpdate()
User.update() //最新的不能用
User.updateMany()
User.updateOne()
*/
/*
// 查找
User.find()
User.where().find()
User.find().skip()
User.find().limit()
User.findById()
User.findOne()
*/