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亿级数据量的性能测试的文章
基础操作(基本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)删除;