赞
踩
参考:
尚硅谷教程:这里
mongodb官方文档:这里
参考博客1:这里
参考博客2:这里
按照是否是关系型,可分为:
关系型数据库(MySQL、Orcal等)
非关系型数据库(MongoDB等)
二者区别:
关系型的是创建表格,非关系型是可以创建任意多个文档。
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。
因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。
而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
MongoDB是为快速开发互联网Web应用而设计的数据库系统。
设计目标: 极简、灵活、作为web应用栈的一部分。
数据模型: 是面向文档的,所谓的文档是一种类似于JSON的结构(增强版的JSON——BSON)。
—三个重要概念—
数据库(mongodb): 是一个仓库,可以存放集合。
集合(collection): 类似于数组,集合中可以存放文档。相当于关系型数据库中的表。
文档(document): 是数据库中的最小单位,我们存储和操作的内容都是文档。
数据库里放集合,集合里放文档,我们操作的就是文档:
—注意—
在mongodb中,数据库和集合都不需要手动创建。我们在创建文档时,如果文档所在的文档或数据库不存在,则会自动创建数据库和集合(在第一次插入文档时创建)。
教程跳转:点击这里
在任意位置打开终端,输入mongo并回车。
以下所有命令,均在mongodb shell中执行。
show dbs
或 show databases
use 数据库名
db
show collections
或show tables
db.集合名.drop()
mongodb manager下载地址:https://www.mongodbmanager.com/download-mongodb-manager-free
下载后双击安装包,傻瓜式操作就能安装好。
远程访问服务器中的mongodb:
1 点击 server>new mongodb connection
2 输入ip和port(port可以通过查看配置文件获取)
3 点击test connection测试能否成功连接
4 点击OK连接
在左侧窗口可以进行数据库/集合的增删改查的操作,在右侧窗口可以进行文档的增删改查的操作,非常方便。
点击小黑图标,可以在右侧窗口进行查询操作,可以在script窗口中输入任何指令并执行,查询结果将显示在下方窗口中。
执行整个脚本、一行脚本、选中的脚本:
对于执行结果可以显示为shell形式(点击Output)、表格形式(点击Documents View):
在进行操作之前,请务必学习上面的mongodb简介部分的内容。
# 如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库
use 数据库名
# 在script窗口中输入指令后执行,下方将返回执行结果
use test
show dbs
或show databases
db
use 数据库名 #切换到数据库
db,dropDatabase() #删除当前库
# step1:选择所在数据库
use test
# step2:当第一个文档插入时,集合就会被创建并包含该文档
db.student.insert({'a':1})
show collections
或show tables
db.集合名.drop()
db.集合名.insert(文档内容)
db.集合名.insertOne(文档内容)
# 示例
db.student.insert({name:"团团",age:1,gender:"female"})
db.集合名.insertMany([
文档1,
文档2,
...
])
# 注意,每条文档必须换行写
db.student.insertMany([
{name:"坨坨",age:1,gender:"female"},
{name:"钩子",age:1,gender:"female"}
])
db.集合名.find()
#1.select * from test.student where id = 1
db.student.find({"_id":1})
#2.select * from test.student where id != 1
db.student.find({"_id":{"$ne":1}})
#3.select * from test.student where id > 1
db.student.find({"_id":{"$gt":1}})
#4.select * from test.student where age < 1
db.student.find({"age":{"$lt":1}})
#5.select * from test.student where id >= 1
db.student.find({"_id":{"$gte":1}})
#6.select * from test.student where id <= 1
db.student.find({"_id":{"$lte":1}})
# 1.and 直接用逗号分隔多个条件
#select * from test.student where id >=3 and id <=4;
db.student.find({"_id":{"$gte":3,"$lte":4}})
#select * from test.student where id >=3 and id <=4 and age >=40;
db.student.find({
"_id":{"$gte":3,"$lte":4},
"age":{"$gte":40}
})
# 2.and 使用"$and"
#select * from test.student where id >=3 and id <=4 and age >=40;
db.student.find({"$and":[
{"_id":{"$gte":3,"$lte":4}},
{"age":{"$gte":40}}
]})
# 3.or
#select * from test.student where id >=0 and id <=1 or id >=4 or name = "团团";
db.student.find({"$or":[
{"_id":{"$lte":1,"$gte":0}},
{"_id":{"$gte":4}},
{"name":"团团"}
]})
# 4.求余
#select * from test.student where id % 2 = 1;
db.student.find({"_id":{"$mod":[2,1]}})
#5.not
#select * from test.student where id % 2 != 1;
db.student.find({
"_id":{"$not":{"$mod":[2,1]}}
})
# in
#select * from test.student where age in (20,30,31);
db.student.find({"age":{"$in":[20,30,31]}})
# not in
#select * from test.student where name not in ('alex','yuanhao');
db.student.find({"name":{"$nin":['Stefan','Damon']}})
# MongoDB: /正则表达/i
#select * from test.student where name regexp '^j.*?(g|n)$';
db.student.find({'name':/^j.*?(g|n)$/i})#匹配规则:j开头、g或n结尾,不区分大小写
# 0表示不显示,1表示显示
#select name,age from test.student where id=3;
db.student.find({'_id':3},{'_id':0,'name':1,'age':1})
#查hobbies中有dancing的人
db.user.find({
"hobbies":"dancing"
})
#查看既有dancing爱好又有tea爱好的人
db.user.find({
"hobbies":{"$all":["dancing","tea"]}
})
#查看第2个爱好为dancing的人
db.user.find({
"hobbies.2":"dancing"
})
#查看所有人的第2个到第3个爱好
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":[1,2]},
}
)
#查看所有人最后两个爱好,第一个{}表示查询条件为所有,第二个是显示条件
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":-2},
}
)
#查询子文档有"country":"China"的人
db.user.find(
{
"addr.country":"China"
}
)
# 1代表升序,-1代表降序
db.user.find().sort({"name":1,})
db.user.find().sort({"age":-1,'_id':1})
# limit表示取多少个document,skip代表跳过几个document
db.user.find().limit(2).skip(0)#前两个
db.user.find().limit(2).skip(2)#第三个和第四个
db.user.find().limit(2).skip(4)#第五个和第六个
#查询年龄大于30的人数
#方式一:
db.user.count({'age':{"$gt":30}})
#方式二:
db.user.find({'age':{"$gt":30}}).count()
db.user.find().distinct()
# 得到的是b这个key的值为null和没有b这个key的文档
db.user.find({"b":null})
db.集合名.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
# 参数说明
query : 相当于where条件。
update : update的对象和一些更新的操作符。
upsert : 可选,默认为false,代表如果不存在update的记录则不更新也不插入,设置为true代表不存在则添加。
multi : 可选,默认为false,代表只更新找到的第一条记录,设为true时,代表更新找到的全部记录。
writeConcern :可选,抛出异常的级别。
# 原始文档数据
{"name" : "钩子", "age" : 1, "gender" : "female"}
# 1.覆盖式修改
db.student.update(
{"name":"钩子"},
{"age":16,"name":"芒果"}
)
得到的结果为{"age":16,"name":"芒果"}
# 2.局部修改:$set
db.student.update(
{"name":"钩子"},
{"$set":{"age":15,"name":"苹果"}}
)
得到的结果为{"name" : "苹果", "age" : 15, "gender" : "female"}
# 3.改多条:将multi参数设为true
db.student.update(
{"name":"钩子"},
{"age":16,"name":"芒果"},
{"multi":true}
)
# 4.有则修改,无则添加:upsert参数设为true
db.student.update(
{"name":"钩子"},
{"age":16,"name":"芒果"},
{"upsert":true}
)
# 5.删除字段:不要gender了
db.student.update(
{"name":"钩子"},
{"$unset":{"gender":""}}
)
# 1.删除符合条件的第一个文档
db.student.deleteOne({ 'gender': "female" })
# 2.删除符合条件的全部
db.student.deleteMany({"_id":{"$gte":3}})#删除id大于等于3的所有
# 3.删除所有
db.student.deleteMany({}) #清空该集合
#增加和减少$inc
#年龄都+1
db.user.update(
{},
{"$inc":{"age":1}},
{"multi":true}
)
#年龄都-10
db.user.update(
{},
{"$inc":{"age":-10}},
{"multi":true}
)
# $push的功能是往现有数组内添加元素
#为名字为武大郎的人添加一个爱好read
db.user.update({"name":"武大郎"},{"$push":{"hobbies":"read"}})
#为名字为武大郎的人一次添加多个爱好tea,dancing
db.user.update({"name":"武大郎"},{"$push":{
"hobbies":{"$each":["tea","dancing"]}
}})
# $pop的功能是按照位置只能从头或从尾即两端删元素,类似于队列。1代表尾,-1代表头
#{"$pop":{"key":1}} 从数组末尾删除一个元素
db.user.update({"name":"武大郎"},{"$pop":{
"hobbies":1}
})
#{"$pop":{"key":-1}} 从头部删除
db.user.update({"name":"武大郎"},{"$pop":{
"hobbies":-1}
})
# $pull可以自定义条件删除
db.user.update({'addr.country':"China"},{"$pull":{
"hobbies":"read"}
},
{
"multi":true
}
)
关于$match $group $avg $project $concat
参考博客:这里
mongose就是一个Node.js的库,用来操作mongodb。
Schema(模式对象):定义了约束mongodb的文档结构的条件。
Model:相当于mongodb中的 collection(集合)。
Document:表示集合中的具体文档。
npm i mongoose --save
// 1、引入 mongoose 模块
const mongoose = require('mongoose');
// 2、连接数据库 27017是默认端口号,可以省略不写, ppxia是需要连接的数据库
mongoose.connect('mongodb://127.0.0.1:27017/ppxia');
// 2.1、这是对数据库的监听,而且是使用once, 只监听一次就行了
mongoose.connection.once('open', (err)=>{
if(!err){
console.log("数据库已连接...");
}
});
mongoose.connection.once('close', (err)=>{
if(!err){
console.log("数据库已断开!!!");
}
});
// 3、重命名,简化操作
const Schema = mongoose.Schema;
// 3.1、创建了约束条件:type是类型,default是默认是女,如果是女的话则不用写性别这个属性值了。
const stuSch = new Schema({
name:String,
age: Number,
gender: {
type: String,
default:"女"
},
address:String
});
// 4、创建了 模型, 数据库中的集合名是 stuSch(会自动加s), 第二个参数是标准,即是约束条件: stuSch
const stuModel = mongoose.model('stuSch', stuSch);
// 5、使用模型创建对象, 当想创建多个的时候,可以使用数组里面存储对象的方式
stuModel.create({
name: "西施",
age: 18,
address: "王者峡谷"
}, (err)=>{
console.log('文档创建成功~');
});
Model.create(doc,[callback]); 创建一个或多个对象
Model.createOne(doc, [callback]); 创建一个对象
Model.createMany(doc, [callback]); 创建多个对象
-doc是需要插入的文档
-callback(err) 是回调函数,可以用来提示是否创建成功了
Model.remove(condition, [callback]);
Model.deleteOne(condition, [callback]);
Model.deleteMany(condition, [callback]);
-- condition 条件
Model.updateMany(condition, doc, [options], [callback]);
Model.updateOne(condition, doc, [options], callback);
** Model.update() 已经不适用了
-- condition 修改的条件
-- doc 修改后的内容/需要修改的内容
需要配合修改操作符来使用:
$set 表示需要设置指定的属性
$unset 表示需要删除指定的属性
$push 表示给数组添加一个新元素,因为文档内也会有数组,数组便会有数组元素
$addToset 表示给数组添加一个新元素,和push的区别是,如果出现同名的数组元素,则不会再添加
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$or [{条件一,条件二}] 表示或的意思,符合条件一或者条件二
$inc 表示自增,用在在原来数据的基础上对数据加减,可用于加薪减薪的操作
Model.find(condition, 投影, [options], [callback]); 查询一个或多个文档
-- 返回的是数组
Model.findById(id, 投影, [callback]); 根据id查询一个文档
Model.findMany(condition, 投影. [callback]); 查询多个文档
Model.findOne(condition, [projection], [options], [callback]); 查询一个文档
-- condition 查询条件
-- 投影/ projection: 投影,也就是 查询条件,有两种方式
{name: 1, _id:0}: 1是显示,0是不显示 "name -_id"显示name, 不显示 _id
-- options: 查询的选项, skip是跳过,limit是限制 {skip: 3, limit:3}
-- callback: 回调函数,有两个参数(err, doc) err是错误类型, doc是文档。
Document事实上是Model的实例,对应mongodb中的文档。
document.get(name)
获取指定属性值
doc.get("name") === doc.name
document.set("name", "猪猪") === doc.name = "猪猪"
documentc.id
属性, 获取id
document.toJSON()
- 转换成 JSON
document.toObject()
将doc对象 转换成 普通JS对象, 转换后, 所有doc的属性和方法都不能使用了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。