MongoDB入门
环境变量
path
bin目录下
在根目录下创建一个文件夹DB 并cmd 输入mongod 启动mongodb服务器
切换db位置 输入: mongod --dbpath D:\db
(启动数据库,并将此文件夹设置为db)
启动成功
修改服务端口(尽量4位以上)
mongod --dbpath (数据库路径) --port (最大不超过65535)
然后再打开一个cmd 输入mongo 连接mongodb出现 ">"
--数据库(databse)
数据库的服务器 用来保存数据
---数据库的客户端
客户端操作服务器,对数据库进行CURD的操作
-mongd来启动客户端
---将mongoDB设置为系统服务,可以自动后台启动不需要手动启动
Manually Create a Windows Service for MongoDB Community Edition 手动创建一个MongoDB 社区版
①创建db 和 log 文件夹
②创建配置文件和bin并肩的目下 mongod.cfg
systemLog:
destination:file
path:c:\data\log\mongod.log
storage:
dbpath:c:\data\db
③以管理员的身份运行cmd 执行如下命令
④如果失败上面操作失败,删除
在控制台输入 sc delete Mongodb 删除之前的服务 重新再来一次
----------------------------------------------------------------------------------------------------------------------------------
三个重要的概念
数据库(database)
数据库是一个仓库,在仓库中可以存放集合
集合(collection)
-集合类似数组,在集合中可以存放文档
文档(document)
-文档是数据库中的最小单位,我们存储和操作的内容都是文档
在MongoDB中 数据库在你是用的时候自动创建不用手动创建
基本指令
1、show dbs
use 数据库名
use test 进入指定的数据库
看集合
show collections 显示数据库中集合
数据库的CURD操作
向数据库中插入文档
db.<collection>.insert(doc)
向集合中插入一个文档
eg:
查看文档
db.<cllection>.find()
eg.
安装图形化界面
插入多条数据
db.collection.insert
修改数据
db.collection.update(查询条件,新对象)
db.stus.find({});
db.stus.update({name:"老沙"},{age:28});
使用修改操作符修改单条数据
$set 修改属性
$unset 删除 属性
db.collection.updateMany()
update默认至修改一条数据 (rug)如果有只修改第一条数据连个同名的默认zhixiuga
修改多个 方法一、
修改多个方法二、
删除操作
db.collection.remove()
-remove ()可以根据条件来删除文档,传递条件
db.collection.deleteOne()
db.collection.deleteMany()
db.stuts.remove({});清空集合 ,一次删一个
db.stuts.drop(); 集合删除
db.dropDatabase() 删除数据库
-- 一般数据库中的数据不会删除,所以删除方法很少用
--------------------------------------------------------------------------------------------------------------------------------
练习:
1.进入my_test数据库
use my_test
2.想数据库的user集合中插入一个文档
db.users.insert({username:"老李"});
3.查询user集合中的文档
db.users.find();
4.查询user集合中插入一个文档
db.users.find()
5.统计数据库user集合中的文档数量
db.users.find().count()
6.查询数据库user集合中username为“老李”的文档
db.users.find({username:"老李"})
7.查询数据user集合中username文档,添加一个address属性,属性值为大连
db.users.uodate({usernname:"老李"},{$set:{address:"大连"}})
8.使用{username:"老李"}替换username为老王的文档
db.users.replace({username:"老李"},{username:"老王"})
9.删除username中老李的address属性
db.users.uodate({username:"老王"},{$unset{address:1})
10.向username为老李文档中添加一个hobby:{cities:["北京","上海","深圳"],movies:["三国","记录"]}
MongDB的文档的属性值也可以是一个文档,当一个文档的属性是一个文档时,我们称为内嵌文档
db.users.update({username:"老李"},{$set:{hobby:{cities:["北京","上海","深圳"],movies:["三国","记录"]}});
10.向username为老唐的文档中,添加一个hobby:{{movies:["A Chinese Odyssey","King of come"]}}
db.users.update({username:"老唐",{$set:{hobby:{{movies:["A Chinese Odyssey","King of come"]}}}}})
11.查询喜欢电影“三国“”的文档 【属性的属性查找,但必须添加引号“”】
db.users.find({"hobby.movies":"三国"})
12.向老唐中添加一个新的电影"大白鲨" 【数组添加】
//$push 用于向数组中添加新的元素 //$addToSet向数组中添加新元素
db.users.update({username:"老唐"},{$:set:{"hobby.movies":"大白鲨"}});// 全部修改了内容
db.users.update({username:"老唐"},{$:push:{"hobby.movies":"大白鲨"}});//不考虑重复内容
db.users.update({username:"老唐"},{$:addToSet:{"hobby.movies":"大白鲨"}});//考虑重复 ,添加失败
13.删除喜欢北京的用户
db.users.remove({"hobby.cities":"北京"})
14.删除user集合
db.users.remove({});//清空集合
db.users.drop();
15.想numbers中插入20000条数据
for (var i =1 ;i<=20000;i++){ //插入时间太慢
db.numbers.insert({num:i});
} ---方法执行2万边,插入2万调数据; --方法执行2W遍,插入执行1遍
db.numbers.find();
db.numbers.remove({});
方法二、
var arr = [];
for (var i =1;i<=20000;i++){
arr.push(num:i);
}
db.numbers.insert(arr);
15.查询numbers中num为500的文档
db.numbers.find({num:500})
16.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:5000}}) -----$gt > 、$gte >= 、$lt < 、 $lte<= 、 $eq = $ne !=
17.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}})
18.查询numbers中大于40小于50文档
db.numbers.find({num:{$gt:40,$lt:50}})
19查询numbers中大于19996的文档
db.numbers.find({number:{$gt:19996}})
20.查询numbers中前10条数据
db.numbers.find({num:{$lte:10}})
//limit可以设置数据上限
db.numbers.find().limit(10); --db.numbers.find();这种开发中很少用
21.查询numbers中弟11条到20调数据
//分页数据的显示, 1--10 11-20 21 -30
公式: skip((页面 -1) * 每页显示的条数).limit(每页显示的条数)
db.numbers.find().skip(10).limit(10)
db.numbers.find().limit(10).skip(10) //顺序调整
22查询numbers中弟21条到30条数据
db.numbers.find().skip(20).limit(10)
---------------------------------------------------------------------------------------------------------
文档之间的关系: 一对一(one to one ) 一对多(one to many ) 多对一(many to one)
//一对一
db.wifeAndHusband.insert(
{
name :""黄蓉,
husband: {
name:"郭靖"
}
},
{
name :""小龙女,
husband: {
name:"杨过"
}
}
)
//一对多 (用户订单)(文章评论)
db.user.insert([{
username:"老李"},{username:"老王"
}]);
db.order.insert({
list:["苹果","月饼"],
user_id:ObjectId("57677adssagyudsx12df");
});
//查找用户老李的订单
db.users.findOne({username:"老李"})
var userID = db.users.findOne({username:"老李"})
db.order.find(user_id:userID)
/*
多对对
分类 - 商品
老师 -学生
*/
db.teachers.insert([
{name:"洪七"},
{name:"黄药师"},
{name:"龟仙人"}
]);
db.stus.insert([
{
name:"郭靖"
teach_ids:[
ObjectId("21312dbshcsbdcsda32ewdcXZc"),
ObjectId("21312dbshcsbdcsda32ewdcXZc")
]
},
{
name:"老李"
teach_ids:[
ObjectId("21312dbshcsbdcsda32ewdcXZc"),
ObjectId("21312dbshcsbdcsda32ewdcX0c"),
ObjectId("21312dbshcsbdcsda32ewdcXlc")
]
}
]);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------练习
导入
1.将dept和emp集合导入到数据库中
2.查询工资小于2000的员工
db.emp.find({sal:{$lt:2000}});
3.查询工资在1000---2000之间员工
db.emp.find({sal:{$gt:1000,$lt2000}})
4.查询工资小于1000或大于2500的员工
db.emp.find({$or[{sal:{$lt:1000}},{sal:{$gt:2500}}]}); //大于大的 小于小的
5.查询财务部(depno:10)的所有员工
var depno = db.dept.findOne({dname:"财务部"}).deptno
db.emp.find({depno:depno})
6.查询销售部的员工
var depno = db.dept.findOne({dname:"销售部"}).deptno
db.emp.find({depno:depno})
7.查询所哟偶mgr为7698的员工 ---查询注意数据类型 number char
db.emp.find({mgr:7698})
8.为所有薪资地域1000的员工增加给你工资400百元 ---inc 在原来的基础上自增
db.emp.updateMany({sal:{$lte:1000}},{$inc:{sal:400}})
sort和投影
sort ()可以用来制定文档排序的规则,sort()需要传递一个对象来执行排序规则 1升序 -1降序
db.emp.find({}).sort({sal:1,empno:-1})
- //limit skip sort 任意顺序
//查询时,可以在第一个参数的位置设置查询的结果 投影 指定你想显示的字段
db.emp.find({},{ename:1,_id:0,sal:1});
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mongoose
mongoose就是一个让我们可以通过Node来操作MongoDB的模块
Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB进一步优化封装并提供了更多的功能
在大多数型的情况下,它被用来吧结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换
---文档转化为对象
- 给文件创建一个模式机构(Scherma)就是约束文档的结构 string 只能写string
- 可以对模型中对象/文档进行验证。
- 数据可以通过类型转换为对象模型
- 可以使用中间件来应用业务逻辑挂钩
- 比Node原生的MongoDB驱动更容易
Shcema(模式对象)
Schema对象定义约束了数据库中的文档结构
Mode ---集合
Model对象作为集合中的所有文档的表示,相当于MongoDB数据库的Collection
Document---文档
Document表示集合中的集体文档,相当于集合中的一个具体的文档
1、安装Mongoose
2、在项目中引入数据库 var mongoose = require("mongoose")
3、连接MongoDB数据库
如果端口好是默认的端口号(27017)则可以省略不写
4.断开数据碎连接(一般不需要调用)
mongoose.disconnect()
mongoose.connect('mongodb'://数据库ip地址:端口/数据库名'{userMongoClient:true})
--mongoose.connect('mongodb'://localhost/test'{userMongoClient:true})
--监听MongoDB数据库的连接状态
在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接
通过监听该对象的状态,可以来监听数据库的连接于断开
数据连接成功的事伴
mongoose.connction.once("open",function(){}});
数据库所开的事伴
mongoose.connction.once("close",function(){});
//引入
mongoose.js
//引入
var mongoose = require ("mongoose");
//连接数据库
mongoose.connect ("mongodb://127.0.0.1/mongoose_test",{useMongoClient:true});
mongoose.connection.once("open",function(){
console.log("数据库连接成功!");
});
mongoose.connection.once("close",function(){
console.log("数据库连接已经断开");
});
//断开数据库连接
mongoose.disconnect();
Schema
Model
Document
var mongoose = require("mongoose");
mongoose.connecte("mongodb://127.0.0.1/mongoose_test",{useMongoClient:true});
mongoose.connecton.once("open",function(){
console.log("数据库连接成功")
});
//创建Schema(模式)对象
//
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},
hodden:Boolean,
meta:{
votes:Number,
favs:number
}
})
var stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:"female"
},
address:String
});
//通过Schema创建Model[代表数据库中的集合]
//mongoose.model(modelName,schema);
//modelName 就是要映射的集合名 mongoose会自动的将集合名变为复数 “students” 是复数就不会变了
var StuModel = mongoose.mode("students",stuSchema);
//向数据库中插入一个文档
StuModel.create({
name:"老李",
age:10
gender:"man"
address:"栖霞山"
},function(err){
if(err){
console.log("插入成功!")
}
});
-----------------------------------------------------------------Mongoose 操作数据库CURD-----------------------------------------------------------------
//插入文档
var stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:"female"
},
address:String
});
var StuModel = mongoose.model("student",stuSchema);
/*
有了Model,我们就可以来对数据库进行增删改查的操作了
Model.create(doc(s),)
-用了创建一个或多个文档并添加到数据库中
参数:
doc(s)可以是一个文档对象,也可以是一个文档对象的数据
callback当操作完成以后调用回调函数
*/
StuModel.create([
{
name:"老猪",
age:22,
gender:"male",
address:"高园庄"
},{
name:"老唐",
age:19,
gender:"male",
address:"长安街"
}
],function(err){
if(!err){
console.log("插入成功!");
console.log(arguments)
}
});
------------------------------------------------------------------------查询操作--------------------------------------------------------------------------
/*
查询的:
Model.find(conditions,)[projection],[options],[callback])
-查询所有符合条件的文档
Model.finById(id,[projection],[options],[callback])
-根据文档的ID 属性查询文档
Model.findOne([contions],[projection],[options],[callbcak])
-查询符合条件的第一个文档 ,总会返回一个具体的文档对象 不是数组
contions 查询条件
projection 投影
-两种方式
{name:1 _id:0} 显示为1 不显示为0
"name -_id"
options 查询选项(skip,limit)
callback 回调函数,查询结果通过回调函数返回回调函数必须传,如果不传回调函数,压根不会查询
*/
StuModel.find({name:"老唐"},function(err,docs){
if(!err)
{
console.log(docs);
}
});
//查询一个
StuModel.find({name:"老唐"},function(err,docs){
if(!err)
{
console.log(doc[0].name); //返回数组
}
});
//查询所有的
StuModel.find({},function(err,docs){
if(!err)
{
console.log(docs);
}
});
//name 图例name
StuModel.find({},{name:1,_id:0},function(err,docs){
if(!err){
console.log(docs);
}
});
//投影2
StuModel.find({},"name age" ,function(err,docs){
if(!err)
{
console.log(docs);
}
});
//影3 不要的前面加一个 ‘-’
StuModel.find({},"name age -_id" ,function(err,docs){
if(!err)
{
console.log(docs);
}
});
//条件查询 skip 跳过钱3个显示后面 【图例---skip 3】
StuModel.find({},"name age -_id",{skip:3},function(err,docs){ //skip: 3 跳过三个
if(!err)
{
console.log(docs);
}
});
//查询条件 skip limit 只显示一个 【图例-----limit&skip】
StuModel.find({},"name age -_id",{skip:3,limit:1},function(err,docs){
if(!err)
{
console.log(docs);
}
});
// findoOne查询一个
StuModel.findoOne({},function(err,docs){ //这应该是docs 而应该是doc
if(!err)
{
console.log(docs);
console.log(docs.name);
}
});
// findById
StuModel.finById("59c4c3cf4e548391467d38",function(err,doc){
if(!err)
{
console.log(doc);
//通过find()查询的结果,返回的对象,就是Document,文档对象
//document 对象是Model的实例 [集合是谁就是谁的实例] docs就是StuModel的一个实例
}
});
------------------------------------------------------------------------------删除-------------------------------------------------------------------------------------
/*
Model.remove(conditions,[callbcak])
Model.deleteOne(conditons,[callback])
Model.deleteMany(conditions,[callbcak]); //一般不需要回调函数
*/
StuModel.remove({name:"小白"},function(err){
if(!err)
{
console.log("删除成功")
}
});
----------------------------------------------------------------------------修改---------------------------------------------------------------------------------
/*
修改
Model.update(conditions,doc,[options],[callback]);
Model.updateMany(conditions,doc,[options],[callback]);
Model.updateOne(conditions,doc,[options],[callback]);
参数:
conditions: 条件
doc:修改后的对象
callback 回调函数
Model.replaceOne(conditions,doc,[options],[callback])
*/
//修改老唐的年龄为20岁
StuModel.updateOne({name:"老唐"},{$set:{age:20}},function(err){
if(!err)
{
console.log("修改成功!");
console.log(doc);
}
});
---------------------------------------------------------------------统计文档数量---------------------------------------------------------------------------
/*
* Model.count(conditions,[callback])
*/
StuModel.count({},function(err,count){
if(!err)
{
console.log(count); //4
}
});