nodejs——MongoDB

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 评论

留下您的评论.