node----mongoDB

node-mongoDB


这里我们介绍一哈哈:mongoDB的基础,以及nodejs是如何操作mongoDB的

MongoDB基础

这里的话,就只献上MongoDB官网的传送门了,安装方法的就是下一步下一步就ok,唯一需要注意的是下载时选择好自己需要的版本

理论知识

“关系型”(SQL) 和 “非关系型”(no SQL)的区别
- 数据库大体分为 "关系型"(SQL) 和 "非关系型"(no SQL)
- 常用的 "关系型数据库" 有: Mysql, Sql Server, Oracle; 而MongoDB则是非关系型数据库的典型代表
-----------------------------------------------------------------------------------
- 关系型数据库的优点:
	- 比较稳定!适合数量级比较大的系统。
	- 比较传统的sql语句,可以说,学会一门,几乎就学会了所有关系型数据库的基础操作(为什么是基础操作呢?没有区别怎么竞争嘛!)
	- 存储内容的关系明确,表格式固定。
- 关系型数据库的缺点: 
	- 虽说适合重量级的系统,但是也是相对而言的,随着量级的增大,速度会越来越慢;
-------------------------------------------------------------------------------------
- 非关系型数据的优点(这里只是对比mongoDB,对其它nosql没有了解):
	- 非常适合轻量级和中量级(也就是说适合千万级用户以下的系统):适合的场景有:事件的记录,内容管理或者博客平台等等。
	- 读取速度快!!!nosql可以以RAM[^1]和ROM[^2]作为载体;而SQL的话就只能以硬盘作为载体。
	- 适合存取关系不太明确的数据模型,集合(对于SQL的表)格式不固定,可以随意改变。
- 非关系型数据库的缺点
	- 由于是热读取,所以启动系统时需要将数据读入RAM中,造成启动速度会越来越慢。
	- 当同一集合中不同文档的格式差距较大时,不便于维护。
	- 稳定性欠缺,存取速度不稳定(但在自动生成id的存储中,MongoDB的速度还是可以名列前茅的)。
	- 事物关系薄弱,也就是说几乎所有的事务关系,都需要在逻辑代码中实现。
-------------------------------------------------------------------------------------
“关系型”(SQL) 和 “非关系型”(no SQL)数据库的层级关系
关系型数据库(SQL)非关系型数据库(noSQL)
数据库数据库Database
集合Collection
文档Document
域Field

这是一篇mongoDB-Mysql的对比文章

这是一篇Mongodb亿级数据量的性能测试的文章

这是MongoDB的中文文档

基础操作(基本CRUD[^3])

库操作

选取、使用: use database_name

查看所有数据库名称:show dbs

显示当前数据库: db (db类似于this指针,指向当前所使用的数据库)

删除数据库:db.dropDatabase(); (这个建议工作时多多使用!这样能让老板牢记您的工作能力 _! )

集合(婊)操作

查看当前数据库下的所有集合: show tables

创建一个集合: db.createCollection(name,[option]) (一般很少主动去创建一个集合,因为在MongoDB中,可以use不存在的数据库,也可以直接点用不存在的表,这样只需要在当中插入一条数据,就会自动生成相应的数据库和表了)

- 列如:创建一个noSQL 数据库,并且在该数据库下创建一个 myTable, 最后在该目录下存入一条数据
-     use noSQL   -没有也可以选取哦
-     db.myTable.insert({"name": "cc"}); - ok,数据库建好了! myTable也建好了!! 数据也插入完成了!!!

删除 cName 这个集合: db.cName.drop();

文档-域 (行-列)操作
C: 创建

插入单条数据:db.collection.insert({"name": "cc"});

插入多条数据:db.collection.insert([{...}, {...}]);

R: 查询

按name查询: db.collection.find({name: "cc"});

查询所有: db.collection.find();

部分查询关键字

$lt    <   (less  than )
$lte    <=  (less than  or equal to )
$gt   >    (greater  than )
$gte   >=    (greater  than or   equal to)

$ne  != (not equal to)不等于  {'age': {'$ne': 20}}
$in  在范围内  {'age': {'$in': [20, 23]}}   注意用list
$nin  (not in)  不在范围内{'age': {'$nin': [20, 23]}} 注意用list。这个方法可以计算某个值既不等于x也不等于y
$regex (正则匹配) db.collection.find({'name': {'$regex': '^M.*'}})  匹配以M开头的名字
$exists      属性是否存在       {'name': {'$exists': True}}     查找name属性存在
$type     类型判断        {'age': {'$type': 'int'}}       age的类型为int
$text      文本查询      {'$text': {'$search': 'Mike'}}     text类型的属性中包含Mike字符串
$or  查找多种条件   ({'$or':[{'name':'chen'},{'name':'wang'}]})

更多条件查询、查询关键字以及相关的查询操作,请查看官方文档

U: 修改

重写:db.collection.update({"name": "cc"}, {name: "ww"});

正确修改: db.collection.update({"name": "cc"}, {$set:{"name":"ww"}});

D: 删除

删除: db.collection.remove({"name": "cc"});


Nodejs操作MongoDB

安装依赖包

npm i mongoose

node 导入依赖包

const mongoose = require("mongoose");

创建MongoDB连接实例

如果只需要用到一个连接,使用: mongoose.connect

如果需要用到多个连接,则需要使用: mongoose.createConnection

两者用法相同 ("mongodb://127.0.0.1/database_name", {useNewUrlParser: true,useUnifiedTopology: true}, function(error){})

实例


const mongoose = require("mongoose");  // 引入依赖包 

const myDBConn = mongoose.createConnection("mongodb://127.0.0.1/myDB",  // 连接数据库 myDB 为本地数据名
{   // 为了兼容低版本
	useNewUrlParser: true,
	useUnifiedTopology: true
}, function(error){
	// error 当连接失败时,数据库返回的提示信息
});

// 只需要一个连接
// const myDBConn = mongoose.connect("mongodb://127.0.0.1/myDB",  // 连接数据库 myDB 为本地数据名
// {   // 为了兼容低版本
// 	useNewUrlParser: true,
//	useUnifiedTopology: true
// }, function(error){
//	// error 当连接失败时,数据库返回的提示信息
// }); 

定义数据库实例对象的格式(Schema)

// 申明一个 集合(表)的数据格式
const userSchema = mongoose.Schema({
	"_id": ObjectId, // 默认id,MongoDB 自动计算,使用时间戳
	"name": String,  // 设置name(字段): string类型
	"age": Number,   // 设置age(字段):   Number类型
	"birthday": Date // 设置birthday(字段): Date类型
});

定一个model实例(需要基于Schema实例)

	const userModel = myDBConn.model("user", userSchema);
	/**
	 * 以 userSchema 实例对象为载体,连接 "users" 数据库。(注意这里连接的是 复数表 ) 
	 * 
	 * 至此: 就创建了一个 MongoDB 的集合连接对象(myDB数据库下的 user 表)
	 * 之后,你就可以使用 node.js 操作 userModel 对象,愉快的编写代码了。 
	 **************************************************************************/

值得一提的是:model 会自动查找数据库的复数版本!!!
也就是说,会自动给你的表名加一个 ‘s’ 然后再去,匹配数据库
是不是很贴心!!!!(那么我们要怎么学会独立,不依靠它呢)
在model的第三个参数传入真正的表名就可以了(偷偷的独立)(滑稽)

	const userModel = myDBConn.model("user", userSchema, "user");
	// 这样 mongoose.model 就回去查找 “user” 表了,第一个参数的值就会被忽略
// 往 userModel 中加入新的字段
userModel.comments.push({title: "title"});

// 移除 userMode 中的某字段
userModel.comments[0].remove();

后面就是一些基本的(CDUR)操作了

R 操作 - 查询操作

userModel.find({}, function(error, docs){ // 查询所有时,第一个参数可以省略不写,直接写回调函数
	console.log(docs);
});
// 等同于执行 SQL 语句: select * from user;

/* -------------------------------------------------------------------------- */
// 查询年龄 大于等于 500, 或者 姓名是 cc 的
userModel.find({ $or: [{ age: { $gte: 500 } }, { name: "cc" }] }, function (findError, docs) {
    if (findError) {
        console.log("查询失败!错误信息:", findError);
    } else {
        console.log("查询成功!");
        console.log(docs);
    }
});
// 等同于执行 SQL 语句: select * from user where age >= 500 or name="cc";

/* -------------------------------------------------------------------------- */
// 从第二条开始,查询3条数据, 年龄升序排列
userModel.find().skip(1).limit(3).sort({age: 1}).exec(function (findError, docs) {
	if (findError) {
		console.log("查询失败!错误信息:", findError);
	} else {
		console.log("查询成功!");
		console.log(docs);
	}
});
// 等同于执行 SQL 语句: select * from user;

第一次使用注释

RAM[^1]: 随机存取存储器, 也就是通常所说的运行内存(比如电脑的内存条);

ROM[^2]: 非随机存取存储器代表, 也就是通常所说的存储内存(比如电脑的硬盘);

CRUD[^3]: 数据库数据术语(增删查改),C(create):增、 R(read):读取、 U(update):修改、 D(delete)删除;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值