MongoDB
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
非关系型数据库
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。
2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论[2],来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。
2009年在亚特兰大举行的"no:sql(east)"讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;"。因此,对NoSQL最普遍的解释是"非关联型的",强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。
优点:
-
- 高可扩展性
-
- 分布式计算
-
- 低成本
-
- 架构的灵活性,半结构化数据
-
- 没有复杂的关系
缺点:
-
- 没有标准化
-
- 有限的查询功能(到目前为止)
-
- 最终一致是不直观的程序
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL 数据库的发展却能很好的处理这些大的数据。
下载和安装
MongoDB分企业版和社区版。
学习阶段我们使用社区版,下载地址为Download MongoDB Community Server | MongoDB。
点击Download按钮后下载。
下载完成后运行安装程序:
安装过程中如果有权限提示,一律点击确定或ok。
安装完成后需要重启电脑系统。
MongoDB基本概念
在MongoDB中,数据库是以文件形式存储的,数据库目录中存储了相应的数据库。
在MongoDB中,把传统数据库中的 "表" 叫作:Collections "集合"。
在MongoDB中,向集合存储数据时,直接以JSON格式,进行存取操作。
在MongoDB中,集合中的数据叫作:Documents "文档"
MongoDB的可视化工具
官方工具:MongoDB compass
下载地址:https://www.mongodb.com/try/download/compass
使用nodejs操作数据库
使用nodejs可以操作MongoDB数据库,结合express可以为用户提供数据库的相关服务。
express要操作数据库,需要使用数据库连接中间件,以下我们使用mongoose这个中间件来操作数据库。
安装 mongoose
在express项目中,要使用mongoose必须先安装:
npm install mongoose
引入及连接
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
mongoose 带有connection对象用来保存连接状态,可以监控其连接状态:
const db = mongoose.connection;
db.on('error', () => {console.error('连接错误!')
});
db.once('open', () => {console.log('数据库已连接!');
});
创建Schema
mongoose采用Schema对象来定义数据的模式。
const {Schema} = require('mongoose');
const newsSchema = mongoose.Schema({title: String,content: String,
})
以下是 mongoose 的所有合法 SchemaTypes:
String
Number
Date
Buffer
Boolean
Mixed
ObjectId
Array
Decimal128
Schema设置
格式
const userSchema = new mongoose.Schema({username: String,password: String,
}, {timestamps: true,versionKey: false
})
数据格式的定义:
{username:String,username:{type:String,type;[],type;[String],//设置默认值default:'123',//当前项是否必填required:true。//字符串//是否将字符串转为小写lowercase:true//是否将字符串转为大写uppercase:true//是否对字符串两端去空格trim:true//数字或者日期类型max:数字/日期min:数字/日期},
}
创建Model
const userModel = mongoose.model("user", userSchema);
第一个参数model的名字。如果没有第三参数,mongoose会用模型名当做集合(表)名字,要求最后以s结尾,如果没有s则会添加s
第二个参数是要使用的Schema。
const userModel = mongoose.model("users", userSchema,'abc');
第三个参数集合名称(表名)。
所有对数据库的操作都是基于Model。Model可以认为它是连接到数据库中的集合(数据表)的操作对象。
新增:
userModel.create({title: "",content: "",
},function(err,result){})const obj = new userModel({title: "",content: "",
});obj.save(function(err,result){})
查询:
userModel.findOne({username:'张三'},function(err,result){}
)
findOne找不到result是null,找到了就是一个对象(document)。
userModel.find({username:'张三'
},function(err,result){})
findById()
查询条件:
userModel.find({age:{$gte:20,$lte:30}},function(err,result){}
)
$gte 大于等于
$lte 小于等于
$gt 大于
$lt 小于
$ne 不等于
.find({$or: [{username: /张三/},{username: /李四/}]})
$or 或者
取记录总数
userModel.count(callback);
分页
userModel.find().skip().limit().then(function(result){})
skip跳过多少 limit取多少
.then方法只负责成功的回调。
也可以使用
userModel.find().skip().limit().exec(function(err,result){})
排序
使用sort排序
userModel.find().sort({username:1}),skip().limit().exec(function(err,result){})sort({username:1}) //关键语句
对username进行排序,1表示升序,-1表示降序
移除
deleteOne({name:'qw'},function(err){})deleteMany({name:/Stark/,age:{$gte:18}},function(err){})findOneAndRemove({name:'Stara'},function(err){})findByIdAndRemove(id,function(err){})
更新
findByIdAndUpdate(id, update, callback);
updateOne({ name: 'Eddard Stark' }, update, callback)
Populate(填充)
//建立用户基本信息模型
const userSchema = new Schema({username: String,password: String,userInfo: {type: Schema.Types.ObjectId,ref: 'userInfo'}
});//用户扩展信息模型
const userInfoSchema = new Schema({name: String,gender: String,
})
让用户表和用户信息表关联,需要在用户表中设置一个字段userInfo
:
userInfo: {type: Schema.Types.ObjectId,ref: 'userInfo'}
ref与
const userInfoModel = model('userInfo', userInfoSchema);
userInfo关联。
用户表的userInfo字段,存储用户信息表的相关记录的_id的值。
在查询时:
userModel.findOne({_id: '6308695b57d10770e47b36b2'}).populate('userInfo').then(function (result) {res.json(result)})
使用populate('userInfo')来填充字段。
userModel.find().populate('userInfo').populate('userextends').then()
then(function(result)) .exec(function(err,result))
本文链接:https://my.lmcjl.com/post/1013.html
4 评论