一、认识MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
官网:https://www.mongodb.com/
1、基本概念
- 数据库(database)
数据库是一个仓库,在仓库中可以存放集合。 - 集合(collection)
集合类似于数组,在集合中可以存放文档。 - 文档(document)
文档是数据库中的最小单位,存储和操作的内容都是文档。
注意:数据库和集合不需要手动创建,创建文档时,如果文档所在的集合或数据库不存在就会自动创建数据库和集合。
2、基本指令
show dbs 等同于 show databases #显示当前所有的数据库
show collections #显示数据库中所有的集合
use 数据库名 #进入到指定的数据库中
db #显示当前所在的数据库
3、文档的增删改查
1、插入文档(_id属性默认自动添加)
db.collection.insert() #向集合中插入一个或多个文档
db.collection.insertOne() #插入一个文档对象
db.collection.insertMany() #插入多个文档对象
2、查询文档
db.collection.find() #查询集合中所有符合条件的文档
db.collection.findOne() #查询集合中符合条件的第一个文档
db.collection.find({}).count #查询所有结果的数量
3、修改文档
db.collection.update(查询条件,新对象) #依据查询条件替换旧对象,默认只修改一个
db.collection.updateOne() #修改一个符合条件的文档
db.collection.updateMany() #同时修改多个符合条件的文档
db.collection.replaceOne() #替换一个文档
比较操作符
$eq 匹配字段值等于指定值的文档
$gt 匹配字段值大于指定值的文档
$gte 匹配字段值大于等于指定值的文档
$lt 匹配字段值小于指定值的文档
$lte 匹配字段值小于等于指定值的文档
$ne 匹配字段值不等于指定值的文档,包括没有这个字段的文档
$in 匹配字段值等于指定数组中的任何值
$nin 字段值不在指定数组或者不存在
逻辑操作符
$or 文档至少满足其中的一个表达式
$and 文档同时满足这些表达式
$not 字段值不匹配表达式或者字段值不存在
$nor 字段值不匹配所有的表达式的文档,包括那些不包含这些字段的文档
元素操作符
$exists <boolean> 等于true时,字段存在,包括字段值为null的文档<boolean> 等于false时,字段不存在
$type 匹配字段值为指定数据类型的文档
评估操作符
$mod 匹配字段值被除有指定的余数的文档
$regex 正则表达式可以匹配到的文档
$text 针对创建了全文索引的字段进行文本搜索
$where 可以通过js表达式或js函数来查询文档
数组操作符
$all 字段值是包含所有指定元素的数组的文档
$elemMatch 数组字段至少一个元素满足所有指定查询条件的文档
$size 匹配数组字段元素个数等于指定数量的文档
投影操作符
$ (projection) 限定查询结果中指定数组字段返回满足条件的第一个元素
$elemMatch (projection) 限定查询结果中指定数组字段返回满足条件的第一个元素
$slice (projection) 控制指定数组字段返回元素个数
更新操作符
$inc 给一个字段增加指定值
$mul
$rename
$setOnInsert upsert为true时,有插入文档操作时插入指定字段值
$set 设置指定字段
$unset 删除指定字段
$min 指定值小于当前值则更新为指定值
$max 指定值大于当前值则更新为指定值
$currentDate设置字段值为当前日期指定值为true设置为当前日期, 或者{ $type: “timestamp” }或{ $type: “date” }的形式”timestamp”和”date”必须是小写的
$ 更新指定数组的第一个元素
$addToSet 数组字段增加一个值
$pop 删除数组字段中的第一个或最后一个元素
$pullAll 删除数组字段中所有指定值,如果指定值为数组,则删除匹配数组内的元素
$pull 符合条件的值将被删除
$pushAll 向数组中追加多个指定值
$push 向数组中追加值
$each 用于$addToSet添加多个值到数组中
$slice 限定$push操作时数组元素的个数,必须和$each一起使用
$sort 与$each一起使用
$position 与$each一起使用,<num>从0开始的索引值
聚合管道操作符
$project 管道中字段的增加、删除和重命名
$match
$limit
$skip
$unwind 文档按照数组字段进行拆分
$group
$sort
$lookup 两个集合之间的关联
$count
4、删除文档
db.collection.remove() #删除一个或多个,第二个参数设置为true,则只会删除一个
db.collection.deleteOne() #删除一个文档
db.collection.deleteMany() #删除多个文档
db.collection.drop() #删除集合
db.dropDatabase() #删除数据库
4、文档间的关系、
- 一对一
- 一对多或多对一
- 多对多
二、认识Mongoose
Mongoose官网:http://www.mongoosejs.net/
它是一个可以通过Node来操作MongoDB的模块。
好处:
- 可以为文档创建一个模式结构(Schema)
- 可以对模型中的对象/文档进行验证
- 数据可以通过类型转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
基本概念:
- Schema(模式对象):定义了数据库中的文档结构
- Modul:作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
- Document:表示集合中的具体文档
Mongoose的使用
1、下载安装Mongoose
npm i mongoose --save
2、在项目中引入mongoose
var mongoose = require('mongoose');
3、连接MongoDB数据库(默认端口号:27017)
mongoose.connect('mongodb://user:pass@localhost:port/database', { autoIndex: false });
//数据库连接成功的事件
mongoose.connection.once("open",function(){});
//数据库连接失败的事件
mongoose.connection.once("close",function(){});
4、断开数据库连接
mongoose.disconnect
5、定义一个schema
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
6、创建一个model
var Blog = mongoose.model('Blog', blogSchema);