MongoDB学习笔记
一.数据库分类
a)关系型数据库(RDBMS):mysql,Oracle,DB2,SQL Server
b)非关系型数据库(NO SQL):
MongoDB,Redis...
键值对数据库
文档数据库MongoDB
二.MongoDB简介
数据模型是面向文档,一种类似json的数据结构。 数据库中存在是各种各样的JSON(BSON)
三.安装(windows环境)
下载地址:https://www.mongodb.org/dl/win32/( 偶数为稳定版,奇数为测试版)
设置环境变量:
测试环境部署成功
启动服务需要如下路径
创建文件路径后再启动,成功监听端口27017如下
进行连接测试,直接cmd输入mongo
语法跟JS类似.
db文件夹内如下:
指定生成的数据库文件夹,命令如下:mongod --dbpath 具体路径 --端口号(可以省略。)
设置为系统服务:
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/里面有详细教程
简化大致如下:
1.在data文件夹(即之前生成的数据库文件夹)内
创建两个文件夹如下:db,log
2.在安装mongoDB的同bin文件夹目录下,创建配置文件mongod.cfg
3.配置文件里面添加如下:
systemLog: destination: file path: c:\data\log\mongod.log storage: dbPath: c:\data\db4.cmd内安装服务
sc.exe create MongoDB binPath= "\"C:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"C:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
服务安装完毕!
四.基本操作
指令:show dbs -显示当前所有数据库
use 数据库名 -进入指定的数据库(如果没有,会暂时先进入,当创建文档的时候会自动创建数据库)
db -显示当前的数据库
show collections -显示数据库中的所有集合
CRUD:
insert: db.集合名.insert({数据});
db.集合名.inset([{数据},{数据}]);
每次插入一条数据,会自动根据时间戳和机器码来生成id,确保文档唯一性,也可以自己指定id,插入的时候
_id;
支持js语法:
一次性添加4000条数据,先组织好数据,然后调用一次inset方法,提高效率
var a = [];
for(var i=1;i<=4000;i++){
a.push({num:i});
}
db.集合名.insert(a);
find:db.集合名.find();--查询所有的文档
db.集合名.find({字段名1:值1,字段名2:值2})
--查询属性是指定值的文档,返回的是数组
db.集合名.findOne()--用来查询集合中符合条件的第一个文档,返回的是对象
db.集合名.find().count()--返回文档数量
mongoDB支持内嵌查询:
db.集合名.find({"属性.内嵌属性名":"值"});
(支持数组内查询)
一些操作符:
db.集合名.find({"num":{$gt:500,$lt:1000}});查询1000>num>500的文档
db.集合名.find().limit(10);--查出前10条数据
db.集合名.find({$or:[{"num":{$lt:500,$gt:1000}}]});查询大于1000或者小于500的文档
db.集合名.find().skip(10).limit(10);--查出11-20条数据。skip跳过对应条数数据
db.集合名.find().sort({num:1});--查询num按正序显示,-1为倒序
db.集合名.find({},{num:1}) --只查询出num这行数据
skip(页数-1*每页条数).limit(每页条数)
update:
db.集合名.update(查询条件,新对象)--修改指定文档,默认情况下使用新对象替换旧对象,只修改一条。
如果要修改指定属性,而不是替换。则需要使用修改操作符,
$set
可以用来修改文档中的指定属性
$unset 用来删除文档中的指定属性
例:db.test.update({name:"xuyi"},{$set:{age:18}}) --查询出name为xuyi的文档,把age更改为18,默认只改一条
db.集合名.updateMany(查询条件,新对象)--修改所有符合条件的数据
db.集合名.replaceOne(查询条件,新对象)--替换
db.集合名.update({查询条件},{$push:{属性名:值}})--数组中追加数据,不会考虑重复性
db.集合名.update({查询条件},{$addToSet:{属性名:值}})--数组中追加数据,考虑重复性
db.集合名.update({查询条件},{$inc:{"属性名":"值"}})--追加查询出的指定属性名的追加的值;
delete:
db.集合名.remove(条件); --删除符合条件的所有文档(默认),如果条件为空。则清空集合(性能差,因为先查,再删)
删除一个的话:db.集合名.remove({条件},true);
db.集合名.deleteOne();
db.集合名.deleteMany();
db.集合名.drop(); --删除集合
db.dropDatabase(); --删除所有数据库
五.文档间的关系
1.one-to-one:通过内嵌文档的模式
2.one-to-many
3.mant-to-many