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}) 

  1. //limit skip  sort 任意顺序 

//查询时,可以在第一个参数的位置设置查询的结果 投影 指定你想显示的字段

db.emp.find({},{ename:1,_id:0,sal:1});

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Mongoose

mongoose就是一个让我们可以通过Node来操作MongoDB的模块

Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB进一步优化封装并提供了更多的功能

在大多数型的情况下,它被用来吧结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换

---文档转化为对象

  1. 给文件创建一个模式机构(Scherma)就是约束文档的结构 string 只能写string
  2. 可以对模型中对象/文档进行验证。
  3. 数据可以通过类型转换为对象模型
  4. 可以使用中间件来应用业务逻辑挂钩
  5. 比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
			}
	
});

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值