IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MongoDB数据库 -> 正文阅读

[大数据]MongoDB数据库

目录

一?引入

? 安装后注意事项

二 MongoDB的基本操作

练习

?三?文档之间的关系

?四 Mongoose

五 Model的方法

六 Document方法

七 Mongoose的模块化


一?引入

程序都是在内存中运行的,如果程序运行结束或者计算机断电,程序运行中的数据都会丢失。
所以我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。

数据库主要分成两种:
(1)关系型数据库(RDBMS)
? ? ? ●?MySQL、Oracle、 DB2、 SQL Server...
? ? ? ●?关系数据库中全都是表

? (2)非关系型数据库(NoSQL Not Only SQL)
? ? ●MongoDB、Redis......
? ? ●?键值对数据库
? ? ●文档数据库MongoDB

MongoDB是为快速开发互联网Web应用而设计的数据库系统。
MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。
MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。( BSON )

下载地址:https://www.mongodb.org/dl/win32/

MongoDB的版本偶数版本为稳定版,奇数版本为开发版。
MangoDB对于32位系统支持不佳,所以B.2版本以后没有再对32位系统的支持。

? 安装后注意事项

打开cmd命令行窗口输入

32位注意:
启动服务器时,需要输入如下内容

mongod --storageEngine=mmapv1

在命令行窗口自行设置?数据库路径与端口号:

mongod --dbpath 数据库路径? --port 端口号

?要操作数据库必须先启动服务器(mongod用来启动服务器),MongoDb 4. 0版本以上在安装的时候已经设置自动启动了。

客户端用来操作服务器,对数据进行增删改查的操作(mongo用来启动客户端)

我们下载的MongoDb是数据库服务器,可以包含多个数据库(database),一个数据库可以存放多个集合(collection),集合里可以有多个文档(document),文档是数据库中的最小单位,我们存储和操作的内容都是文档。

二 MongoDB的基本操作

在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合

基本指令:
? ?show dbs
? ?show databases
? ? ? ? ?-显示当前的所有数据库
use 数据库名
? ? ? ?-进入到指定的数据库中.
db
? ? ? - db表示的是当前所处的数据库
show collections
? ? ? -显示数据库中所有的集合
数据库的CRUD (增删改查)的操作

?以下的colection表示集合名:

(1)向集合中插入文档:db.集合名.insert (doc)

? db. collection. insertOne():插入一个文档对象
? db. collection. insertMany ():插入多个文档对象(参数为数组)

//插入一个
db.stus.insert({name:"八戒",age:28, gender:"男"});
//插入多个
db.stus.insert([
{name: "张三",age:38,gender:"男"},
{name:"亚梦" ,age:16,gender:"女"} ,
{name: "米业",age:14,gender:"女"}
]) ;
/*当我们向集合中插入文档时,如果没有给丈档指定_ id美性, 则数据库会自动为文档添加_ id,该属性用来作为文档的唯一标识
_id我们可以自己指定,如果我们指定了数据库就不会再添加了,如果自己指定_ id 也必须保证它的唯一性
*/
// 生成_id
ObjectId()

(2)查询当前集合中的所有的文档:db.collection.find ()
? ? ? ?find()用来查询集合中所有符合条件的文档,返回的是一个数组
? ? ? ?find()可以(非必须)接收一个对象作为条件参数:{属性:值},查询属性是指定值的文档,可指定多个,之间用逗号连接,参数为{ }表示查询集合中所有的文档。

? db. collection. findOne ():用来查询集合中符合条件的第一个文档
? ? ? findOne ()返目的是一个文档对象

?db.collection. find({ }) .count ()查询所有结果的数量

(3)修改:db. collection. update (查询条件,新对象)

? ? ? ? ? ?update ()默认情况下会使用新对象来替换旧的对象

db. stus .update ({name: "沙和尚"}, {age:28}) ;

? 如果需要修改指定的属性,而不是替换需要使用"修改操作符"来完成修改:
? ? ? ? ? ? ? ? ? ? ? ? ? 1)? $set 可以用来修改文档中的指定属性?

db.stus.update(
{"name" : 亚梦},
{$set: {
gender:20
}},
//?update()默认只改一个
//添加下面的就可以修改多个符合条件的
{
multi:true
)
)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)$unset可以用来删除文档的指定属性

//要删除的属性,它的值任意
db.stus.update(
{"name" : 亚梦},
{$unset:{
age:1
}}
)

db. collection.updateMany ()--->同时修改多个符合条件的文档
db. collection.updateOne ()--->修改一个符合条件的文档
db. collection.replaceOne ()---->替换一个文档

(4)删除

db. collection. remove ()---->删除符合条件的所有的文档(默认情况下会删除多个)

? ? ? ?remove ()可以根据条件来删除文档,传递的条件的方式和find()-样
? ? ? 如果remove ()第二个参数传递一个true,则只会删除一个
? ? ? 如果只传递一个空对象作为参数,则会删除集合中的所有文档
db. collection. deleteOne ()--->删除一个
db. collection. deleteMany ()--->删除多个
db.collection.drop() 删除集合
db. dropDatabase () 删除数据库

-般数据库中的数据都不会删除,所以删除的方法很少调用
一般会在数据中添加一个字段(isDel),来表示数据是否被删除

db.jihe.insert([
{
name:"zs",
isDel:0
},
{
name:"lisi",
isDel:0
},
{
name:"wangwu",
isDel:0
}
]);
db.jihe.updateOne({name:"lisi"},{$set:{isDel:1}});
db.jihe.find({isDel:0})

练习

MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档

/*1 向username为bj的文档中添加一个
hobby:{cities : [ "beijing", "shanghai", "shenzhen"],movies:["sanguo", "hero"] }
*/
db.users.update(
{username:"bj"},
{$set:{hobby:{cities:[ "beijing", "shanghai", "shenzhen"],movies:["sanguo", "hero"] }
}
});
//2查询喜欢电影hero的文档
/*MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号*/
db.users.find({'hobby.movies':"hero"});
//3向username为bj中添加一个新的电影Interstellar
  //$push用于向敷组中添加一个新的元素
  //$addToSet向数组中添加一个新元素 ,如果数组中已经存在了该元素,则不会添加
db.users.update ({username:"bj"}, {$push:{"hobby.movies":"Interstellar"}}) ;
 //db.users.update ({username:"bj"}, {$addToSet: {"hobby.movies":"Interstellar"}})
//4.删除喜欢beijing的用户
db.users.remove({"hobby.cities":"beijing"});
//向numbers中添入20000条数据
var arr=[];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insert(arr);
//查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}}) ;
//查询numbers中num等于5000的文档
db.numbers.find({num:{$eq:500}}) ;
//查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}}) ;
//查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40,$lt:50}}) ;
//查询numbers中num小于20或大于50的文档
db.numbers.find({
$or:[{num:{$lt:20}},{sal:{$gt:50}}]
})
//为所有num小于20的增加30(如果是减30则把30改为-30)
db.numbers.updateMany({num:{$lt:20}},{$inc:{num:30}});
// limit()设置显示数据的展示
db.numbers.find().limit (10) ;
//查询11到20条数据
//skip()用于跳过指定数量的数据,skip((页码-1) *每页显示的条数).limit(每页显示的条数);
//MongoDB会自动调整skip和limit的位置
db.numbers.find().skip(10).limit(10)

?三?文档之间的关系

(1)一对一

db. wi feAndHusband. insert ([
{
name:"黄蓉" ,
husband: {
name:"郭靖"
}
},
{
name:"潘金莲",
husband: {
name: "武大郎"
}
}
])

(2)一对多

db.users.insert ([{
username:"swk"
}, {
username:"zbj"
}]) ;
db.order.insert([
{
list:["苹果","香蕉"],
//swk的id
user_id:ObjectId("62f63f1ba51086bb19a54cf0")
},
{
list:["牛肉"],
//bj的id
user_id:ObjectId("62f63f1ba51086bb19a54cf1")
}])
//查找swk的订单
var user_id=db.users.findOne({username:"swk"})._id;
db.order.find({user_id:user_id});

(3)多对多

db.teachers.insert([
{name:"老师一"},
{name:"老师二"},
{name:"老师三"}
]);
db.stus.insert([
{
  name:"学生一",
 tech_ids:[ObjectId("62f62cf6a51086bb19a54ced"),ObjectId("62f62cf6a51086bb19a54cee")]
}
},{
name:"学生二",
//老师一、二、三的_id
tech_ids:[ObjectId("62f62cf6a51086bb19a54ced"),ObjectId("62f62cf6a51086bb19a54cee"),
ObjectId("62f62cf6a51086bb19a54cef")]
}
]);

? ?补充:查询文档时,默认情况是按照_id的值进行排列(升序)
? ? ? ? ? ? ?sort ()可以用来指定文档的排序的规则,sort ()用要传递一个对象来指定排序规则,参数为{属性:1}表示升序,{属性:-1} 表示降序

//先按照sal升序排列,再对sal相同的按照empno降序排列
db.emp.find({}).sort({sal:1, empno:-1}) ;

? limit skip sort可以以任意的顺序进行调用

?四 Mongoose

mongoose的好处:
? ? ?●可以为文档创建一个模式结构( Schema )
? ? ?●可以对模型中的对象/文档进行验证
? ? ?●数据可以通过类型转换转换为对象模型
? ? ?●可以使用中间件来应用业务逻辑挂钩
? ? ?●比Node原生的MongoDB驱动更容易

mongoose中为我们提供了几个新的对象
一Schema(模式对象)
? ? Schema对象定义约束了数据库中的文档结构
一Model
? ? ?Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
一Document
? ? ?Document表示集合中的具体文档,相当于集合中的一个具体的文档
?

连接数据库基本步骤:

1.下载安装Mongoose

npm? i mongoose --save

2.在项目中引入mongoose?
const mongoose = require ( "mongoose") ;
3.连接MongoDB数据库
mongoose.connect ( 'mongodb://数据库的ip地址:端口号/数据库名')
?如果端口号是默认端口号(27017) 则可以省略不写

4?断开MongoDB数据库(一般不需要调用)
? ? MongoDB数据库,一般情况下, 只需要连接-次,连接-次以后,除非项目停止服务器关闭,否则连接-般不会断开
? ?mongoose. disconnect ()


监听MongoDB数据库的连接状态:
? ? 在mongoose对象中, 有一个属性叫做connection,该对象表示的就是数据库连接
? ? 通过监视该对象的状态,可以来监听数据库的连接与断开
? ? 数据库连接成功的事件
? ?mongoose. connection. once ("open", function() {}) ;

? ? 数据库断开的事件
? ? mongoose. connction. once ("close", function() {}) ;

const mongoose=require("mongoose");
const { Schema } = mongoose;
mongoose.connect("mongodb://localhost:27017/mymongose");
mongoose.connection.once("open",function(){
    console.log("数据库连接成功")
})
mongoose.connection.once("close", function() {
    console. log ("数据库连接已经断开~~~");
}) ;

//创建schema (模式)对象
const stuschema = new Schema({
        name: String,
        age : Number,
        gender: {
            type:String,
            //默认值
            default: "female"
        },
        address: String
    }) ;
//通过schema,来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model (modelName, schema) :
//modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
const StuModel = mongoose.model("student",stuschema);
//向数据库中插入一个文档
//StuMode1. create (doc, function(err) {}) ;
StuModel.create({
    name: "小明",
    age: 19,
    gender: "male",
},function(err){
    if(!err){
        console.log("插入成功");
    }
})

五 Model的方法

(1)Model. create (doc(s),[callback])
? -用来创建一个或多个文档并添加到数据库中
? -参数:
? ? doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
? ? callback当操作完成以后调用的回调函数

(2)Model. find (conditions, [projection], [options], [callback])
? ? ? ? ? ?-查询所有符合条件的文档,总会返回一个数组
? ? ? ?Model. findById(id, [projection], [options], [callback])
? ? ? ? ? ?-根据文档的id属性(不用带ObjectId)查询文档,总会返回一个文档对象
? ? ? ?Model. findOne ([conditions],[projection], [options], [callback].
? ? ? ? ? ?-查询符合条件的第一个文档,总会返回一个文档对象

conditions查询的条件
projection投影?需要获取到的字段

? ? ? ? ? ? ? ?两种方式:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {name:1,_id:0}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "nmae? -_id"

/查询结果只有名字
//第一种方式
/*StuModel.find({},{name:1,_id:0},function(err,docs){
    if(!err){
        console.log(docs);
    }
})*/
//第二种方式
StuModel. find({}, "name  -_id", function (err,docs) {
    if(!err) {
        console.log (docs) ;
    }
}) ;

options查询选项 (skip limit)
callback回调函数,查询结果会通过回调函数返回
回调函数必须传,如果不传回调函数,压根不会查询

通过find()查询的结果,返回的对象,就是Document, 文档对象
Document对象是Model的实例,通过Model查询到结果都是Document

StuModel.findById("62f716d63bf6858aee2dc8ae", function (err,doc) {
    if(!err) {
        console.log (doc instanceof StuModel) ;//true
    }
}) ;

(3)Model. update (conditions, doc, [options], [calIback])
? ? ? ? ?Model. updateMany (conditions, doc, [options], [callback])
? ? ? ? ?Model. updateOne (conditions, doc, [options], [cal Iback])
? ? ? ? ? ? ? ? ? ? ? ?一用来修改一个或多个文档
? ? ? ? ? ? ? ? ? ? ? ? ?一参數:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?conditions? 查询条件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?doc? 修改后的对象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?options? ? 配置参数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?callback? ?回调函数

StuModel.updateOne({name:"小明"},{$set:{age:20}},function(err){
    if(!err){
        console.log("修改成功")
    }
})

(4)Model . remove (conditions,[calIback] )
? ? Model. deleteone (conditions, [callback])
? ? Model.?deleteMany (conditions,[callback] )

? ? ? ? ? ? ? ? ? ? ? ? ? ---删除

(5)Model. count (conditions, [callback])
? ? ? ? ? ? ? ? 统计文档的数量

六 Document方法

const mongoose=require("mongoose");
const { Schema } = mongoose;
mongoose.connect("mongodb://localhost:27017/mymongose");
mongoose.connection.once("open",function(){
    console.log("数据库连接成功")
})
mongoose.connection.once("close", function() {
    console. log ("数据库连接已经断开~~~");
}) ;

//创建schema (模式)对象
const stuschema = new Schema({
    name: String,
    age : Number,
    gender: {
        type:String,
        //默认值
        default: "female"
    },
    address: String
}) ;
const StuModel = mongoose.model("student",stuschema);
//创建一个Document
const stu=new StuModel({
    nmae:"heidou",
    age:15,
    gender:"male",
    address:"西南"
})
1/*
document的方法(吞服哦文档对象调用)
Model #save ([options],[fn])
*/
stu. save (function (err) {
    if(!err) {
        console. log ("保存成功~")
    }
}) ;
StuModel.findOne({},function(err,doc){
    /*
    update(update, [options], [callback])
             -修改对象
     remove ([callback])
          一删除对象

    * */
    //修改的方式一
 /*   doc.update({$set:{age:28}},function(err){
        if(!err){
            console.log("修改成功")
        }
    })*/
    //修改的方式二
    doc.age=18;
    doc.save();

    //删除
   /* doc.remove(function(err){
        if(!err){
            console.log("删除成功")
        }
    })*/
    /*
          get(name)
           ---获取文档中的指定属性值
           //console.1og (doc.get ("age"));
           //console. 1og (doc.age)
         set(name,value)
           ---设置文档的指定的属性值
           //doc. set ("name", "猪小小”) ;
         id
         -----获取文档的_id属性值
         //console.log(doc.id);
         //console.log(doc._id);
         */

        /*toObject()
                   -将Document对象转换为 一个普通的JS对象,
                   转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用1
*/
         doc=doc.toObject();
         delete doc.age;
         console.log(doc._id)
})

七 Mongoose的模块化

?

?

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:12:48  更:2022-08-19 19:15:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:17:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码