MongoDB快速入门,下载 + 配置 + 使用

本文档详细介绍了MongoDB的特性、下载安装、配置文件解析,以及数据库的基本操作,包括CRUD(创建、读取、更新、删除)。同时,还涉及到排序、映射以及使用Mongoose进行操作的示例。MongoDB是一种NoSQL的文档型数据库,易于快速开发Web应用。文章还展示了如何在Node.js环境中使用Mongoose进行连接、增删改查等操作。
摘要由CSDN通过智能技术生成

一、简介

1.特点

  • 是为了快速开发互联网Web应用而设计的数据库系统
  • 是一种No SQL数据库(非关系型数据库),一种文档型数据库
  • 所谓文档型数据库,是一种类似于JSON的结构,简单理解就是value可以存储二进制数据(BSON)

2.下载

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

注意:奇数版为测试版,偶数版为稳定版

  1. 安装mongodb
  2. 在根目录下创建配置文件 mongo.config
dbpath=D:\1tools\mongodb\data\db
logpath=D:\1tools\mongodb\data\log\mongo.log

3.配置文件详解

# 端口号,默认27017
#port=27017
 
# 数据库文件位置
dbpath=D:\1tools\mongodb\data\db
 
#日志文件位置
logpath=D:\1tools\mongodb\data\log\mongo.log
 
# 是否追加方式写入日志,默认True
logappend=true
 
# 设置绑定ip
bind_ip = 127.0.0.1

# 设置端口
port = 27017
 
# 是否以守护进程方式运行,默认false
fork = true
 
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=false
 
# 启用日志文件,默认启用
journal=true
 
# 启用定期记录CPU利用率和 I/O 等待,默认false
#cpu = true
 
# 是否以安全认证方式运行,默认是不认证的非安全方式
#noauth = true
#auth = true
 
# 详细记录输出,默认false
#verbose = true
 
#用于开发驱动程序时验证客户端请求
#objcheck = true
 
# # 启用数据库配额管理,默认false
#quota = true
 
# 设置oplog日志记录等级,默认0
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#oplog = 0
 
# 是否打开动态调试项,默认false
#nocursors = true
 
# 忽略查询提示,默认false
#nohints = true
 
# 禁用http界面,默认为localhost:28017
#nohttpinterface = true
 
# 关闭服务器端脚本,这将极大的限制功能,默认false
#noscripting = true
 
# 关闭扫描表,任何查询将会是扫描失败
#notablescan = true
 
# 关闭数据文件预分配
#noprealloc = true
 
# 为新数据库指定.ns文件的大小,单位:MB
# nssize = <size>
 
# 用于Mongo监控服务器的Accout token。
#mms-token = <token>
 
# Mongo监控服务器的服务器名称。
#mms-name = <server-name>
 
# Mongo监控服务器的Ping间隔时间,即心跳
#mms-interval = <seconds>
 
# Replication Options
 
# 设置主从复制参数
#slave = true # 设置从节点
#source = master.example.com # 指定从节点的主节点
# Slave only: 指定要复制的单个数据库
#only = master.example.com
# or
#master = true # 设置主节点
#source = slave.example.com 
 
# 设置副本集的名字,所有的实例指定相同的名字属于一个副本集
replSet = name
 
#pairwith = <server:port>
 
# 仲裁服务器地址
#arbiter = <server:port>
 
# 默认为false,用于从实例设置。是否自动重新同步
#autoresync = true
 
# 指定的复制操作日志(OPLOG)的最大大小
#oplogSize = <MB>
 
# 限制复制操作的内存使用
#opIdMem = <bytes>
 
# 设置ssl认证
# Enable SSL on normal ports
#sslOnNormalPorts = true
 
# SSL Key file and password
#sslPEMKeyFile = /etc/ssl/mongodb.pem
#sslPEMKeyPassword = pass
 
# path to a key file storing authentication info for connections
# between replica set members
#指定存储身份验证信息的密钥文件的路径
#keyFile=/path/to/keyfile

二、基本操作

1.基本指令

  • 显示所以的数据库
show dbs
show databases
  • 使用数据库
use [数据库名]
  • 显示当前所属数据库
db
  • 显示数据库中所有的集合
show collections

2.CRUD操作

(1) 插入操作
db.<集合名称>.insert(<文档>)

举例:向test数据库的stu集合插入一个学生对象或多个学生对象

  • 插入一个
use test
db.stu.insert({name:"Jerry",age:18,gender:"male"})
  • 插入多个
use test
db.stu.insert([
	{name:"Jerry",age:18,gender:"male"},
	{name:"Tom",age:16,gender:"male"},
])

当我们没有给文档指定 “_id” 属性时,数据库会自动为文档增加该属性

该属性是文档的唯一表示

ObjectId()
会返回一个唯一的Id

insertOne和insertMany是对insert的一个拆分

(2) 查询操作
db.<集合名称>.find(<条件对象>)
  • 查询stu中所有的文档
db.stu.find()
  • 查询name属性为“Jerry”且age属性为18的文档
db.stu.find({name:"Jerry",age:18})
  • find()返回的是一个数组,可以在最后加上中括号来指定第几个文档

例如:

db.stu.find({name:"Jerry",age:18})[0]
  • findOne()返回的就是一个文档,相当于find(<条件>)[0]

    findOne()可以直接在最后指定某一条属性,例如findOne(<条件>).name

  • find(<条件>).count() ,

    find(<条件>).length()

可以得到满足条件文档的数量

如果条件中的字段对应文档中的一个数组,那么value只要在这个数组中就满足条件

条件查询

NameDescription
$eqMatches values that are equal to a specified value.相等
$gtMatches values that are greater than a specified value.大于
$gteMatches values that are greater than or equal to a specified value.大于等于
$inMatches any of the values specified in an array.在数组内
$ltMatches values that are less than a specified value.小于
$lteMatches values that are less than or equal to a specified value.小于等于
$neMatches all values that are not equal to a specified value.数组属性中的值全不等于
$ninMatches none of the values specified in an array.不在数组内
//举例
db.stu.find({name:"Jerry",age:{$lt:18}})
//查询名字为Jerry且年龄大于18的
//举例
db.stu.find({$or:[{age:{$lt:16}},{age:{$lt:18}]})
//查询年龄大于18或小于16的
(3) 修改操作
db.<集合名称>.update(<查询条件>,<新对象>)

update默认使用新对象替换旧对象

举例:

// 修改前
// stu集合 -->   {name:"Jerry",age:18,gender:"male"}
// stu集合 -->   {name:"Tom",age:16,gender:"male"}

db.stu.update({name:"Tom"},{age:13})

//修改后
// stu集合 -->   {name:"Jerry",age:18,gender:"male"}
// stu集合 -->   {age:13}

如果需要修改指定属性,需要使用修改标识符

​ $set – 用于增加或修改指定属性

​ $unset – 用于删除指定属性

​ $push – 向数组中增加一个元素(可重复)

​ $addToSet – 向数组中增加一个元素(不可重复)

举例:

db.stu.update(
	{name:"Jerry"},
	{
  		$set:{
   	 		age:"13"
  		}
	}
)

update默认情况下只会修改一个文档,修改多条文档时要用updateMany,或者添加update的第三条属性

db.stu.update(
	{name:"Jerry"},
	{
  		$set:{
   	 		age:"13"
  		}
	},
	{
		multi:true
	}
)

其他修改标识符查看官网

(4) 删除操作
db.<集合>.remove(<条件>)
db.<集合>.deleteOne(<条件>)
db.<集合>.deleteMany(<条件>)

remove、delete的条件与find相同

remove默认删除多个,它的第二个参数为boolean类型的,当值为true时只删除一个

remove必须传入参数,如果要删除所有则传入一对空的大括号(性能差),一般使用删除整个集合来删除所有记录

db.<集合>.drop()

此外,删除数据库是

db.dropDatabase()
(5) 其他操作
db.<集合>.repalceOne(<条件>,<要替换的新文档>)

替换一个文档

三、sort和映射

3.1 sort

可以通过sort对查询的结果进行排序

db.test.find({}).sort({<排序的属性>:<1或-1> , ...})
其中1代表升序,-1代表降序

3.2 映射

基本用法:

db.test.find({},{<映射的属性>:<0或1> ,  .....})
其中1代表显示,0代表不显示

举例:

db.test.find({},{name:1,_id:0})

四、Mongoose

4.1 安装和数据库的连接

安装:

npm i mongoose --save

连接

const mongoose = require("mongoose")
mongoose.connect("mongodb:/localhost/test",{useMongoClient:true})

监听连接状态

//监听连接成功
mongoose.connection.once("open",()=>{
	console.log("连接成功~~~")
})
//监听断开连接
mongoose.connection.once("close",()=>{
console.log("断开连接~~~")
})
//手动断开连接
mongoose.disconnect()

4.2 Schema与Model

Schema:用于规定文档的结构的,每个schema对应数据库中的一个集合的结构,它不能用于直接操作数据库。

Model:对应数据库中的一个集合,可以用于对集合进行操作。

使用步骤:

const mongoose = require("mongoose")
mongoose.connect("mongodb:/localhost/student",{useMongoClient:true})

//获取Schema
const Schema = mongoose.Schema
//创建一个集合的Schema
let stuSchema = new Schema({
    name:String,
    age:Number,
    gender:{
        type:String,
        default:"male"
    }
})
//获取Model
const Model = mongoose.Model
//通过Schema创建一个Model
let StuModel = Model("student",stuSchema)

//通过StuModel对数据库进行操作
StuModel.create({name:"小明",age:18},(err)=>{
    if(!err){
        console.log("数据插入成功~~~")
    }
})

Schema的参数是一个对象,属性为对集合的属性名,值为该属性的类型,值也可以是一个类似于上例的对象,用于规定该属性的默认值。

Model的第一个参数是集合的名称,第二个参数是一个Schema的对象实例,最终返回一个对应某一集合的Model,该Model可对集合进行操作。

4.3 Schema详讲

此小章中的StuSchema默认为4.2中用例中创建的。

更多关于Schema的API参照mo ngoose官方文档

4.3.1 添加文档

Model.create(dos , [callback])

用于添加一个或多个文档

举例:

//向student集合中添加两个文档
StuModel.create([{name:"小明",age:16,gender:"male"},}{name:"小红",age:18,gender:"female"}],(err,docs)=>{
	if(!err){
		console.log("插入成功")
	}
})

第一个参数为一个数组,数组中是根据Schema格式的文档

第二个参数是一个回调函数,回调函数的第一个参数是错误信息,第二个参数添加的文档

4.3.2 查询文档

此处document(文档)是对应Model的实例

Model.find(condition,[映射的属性],[option],[callback])

用于查询文档,回调函数的第二个参数会返回一个文档数组

举例:

//查找年龄大于18的文档,并只显示名称和年龄的前3条数据
StuModel.find({age:{&gt:18}},"name age -_id",{limit:3},(err,docs)=>{
	if(!err){
		console.log(docs)
	}
})

//此处第二个参数可以按照mongodb原来的 {name:1,age:1,_id:0} ,也可以把要先显示的属性用空格隔开,不显示的前面加 "-"。

Model.findOne(condition,[映射的属性],[callback])

用于查询一个文档,回调函数的第二个参数会返回一个文档

举例:

//查找名字为小明的第一个文档
StuModel.findOne({name},(err,docs)=>{
	if(!err){
		console.log(docs)
	}
})

Model.findById(id,[映射的属性],[callback])

通过Id查询文档,回调函数的第二个参数会返回一个文档

举例:

//查找id值为asdasdasd的文档
StuModel.findById("asdasdasd",(err,docs)=>{
	if(!err){0
		console.log(docs)
	}
})
4.3.3 修改文档

Model.update(condition,newDoc,[callback])

修改符合条件的文档

Model.update({name:"小明"}, { &set:{name:"大明"}},{multi:true}, (err)=>{
	if(!err){
		console.log("修改成功")	
	}
});

Model.updateOne(condition,newDoc,[callback])

修改符合条件的一个文档

Model.updateOne({name:"小明"}, { &set:{name:"大明"}}, (err)=>{
	if(!err){
		console.log("修改成功")	
	}
});

Model.updateMany(condition,newDoc,[callback])

修改符合条件的多个文档

Model.updateMany({name:"小明"}, { $set:{name:"大明"}}, (err)=>{
	if(!err){
		console.log("修改成功")	
	}
});
4.3.4 删除文档

Model.deleteOne(conditions,[callback])

删除一个文档

Model.deleteOne({name:"小明"}, (err)=>{
	if(!err){
		console.log("删除成功")	
	}
});

Model.deleteMany(conditions,[callback])

删除多个文档

Model.deleteMany({name:"小明"}, (err)=>{
	if(!err){
		console.log("删除成功")	
	}
});

4.4 Document(文档)

文档是Schema的实例对象,一个Document对象就对应数据库中的一个文档。

文档的创建是通过某个集合的Schema得到的,以Student集合举例

//创建文档,通过Schema创建的文档会自动添加_id属性
let stu1 = new StuSchema({name:"小红",age:16,gender:"female"})
//在student集合中保存文档(文档存在则用当前文档覆盖掉数据库中的文档,不存在则新建)
stu1.save()

Document有五个常用的方法save(),update(),remove(),get(),set()

save()用于将当前文档的状态保存在数据库中

update()与Schema对象的update用法一致,但少了第一个参数,更新后文档不会在数据库中保存,需要再调用save()

remove()与Schema对象的remove用法一致,但少了第一个参数

get()是获取该文档的某一属性,参数只有一个属性名称

set()是修改该文档的某一属性,第一个参数是属性名称,第二个参数是新的值

举例:

let stu;
//用stu获取文档
StuSchema.findOne({},(err,doc)=>{
	if(!err){
		stu = doc;
	}	
})

//文档中的数据 -> {_id:"asdasdasd",name:"小明",age:18;gender:"male"}

stu.set("name","小小明")
let name = stu.get("name");
console.log(name)	//输出 -> 小小明


stu.update({$set:{age:20}},err=>{
    if(!err){
        console.log("修改成功")
    }
})

//文档中的数据 -> {_id:"asdasdasd",name:"小明",age:18;gender:"male"}

stu.save();

//文档中的数据 -> {_id:"asdasdasd",name:"小小明",age:20;gender:"male"}

stu.remove();

//文档中该条数据被删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值