MongoDB笔记(一)
MongoDB 简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
MongoDB 安装
-
从MongoDB官网下载mongodb,解压到本地文件夹
-
创建目录
data
与log
-
新增配置文件
# 数据存放目录
dbpath=/Users/sure/opt/mongodb-macos-x86_64-4.2.9/data
# 指定端口号
# port=27017
# 指定日志文件
logpath=/Users/sure/opt/mongodb-macos-x86_64-4.2.9/log/master.log
# 写日志的模式:设置为true为追加,默认覆盖,如未指定启动时将覆盖原日志文件
logappend=true
# 是否后台执行 默认为false
fork=true
# 最大连接数
maxConns=4000
# 用户认证,默认false,不需要认证,进入数据库需要auth认证
# 当数据库没有用户,则不需要验证也可以,创建用户之后都要验证
# auth = true
-
启动MongoDB,在安装目录下执行
./bin/mongod -f mongo.conf
-
连接测试
mongo --host 127.0.0.1 --port 27017
数据库操作
-
show dbs
查看数据库或者使用show databases
-
use dbname
: 如果数据库不存在则创建数据库,否则切换到数据库要求:
-
不能是空字符串
-
不能含有特殊字符空格,点,$
-
应该全部小写
-
不超过64字节
默认给我们提供的数据库:
- admin:
- local: 该数据库中的数据不会被复制,集群时不会相互复制
- config:用于分片设置时,用于保存分片的相关信息
-
-
db
查看当前的数据库 -
db.dropDataBase
删除数据库
集合操作
- 显示创建集合
db.createCollection('name')
- 删除集合
db.name.drop()
- 查看集合
show collections
文档CRUD操作
-
文档插入
insert()
与save()
都可以,这样可以隐式的创建集合classdb.class.insert({"classid":"001","name":"语文","teacher":"0001"})
-
插入多条
insertMany()
,使用数组插入,批量插入出错时,可以使用trycatchdb.teacher.insertMany([ {"teacherid":"001","name":"zhangsan","age":23}, {"teacherid":"002","name":"lisi","age":24}, ])
-
文档查询
find()
// 查询全部 db.teacher.find(); // 条件查询 db.teacher.find({"name":"lisi"}) // 投影查询 查询指定的列后一个参数指定列 1 代表查询 _id 可以通过指定0来排除 db.teacher.find({name:"lisi"},{age:1,name:1,_id:0});
-
使用try catch 貌似没什么用,需要再查查
try{ db.teacher.insertMany([ {"teacherid":"003","name":"wangwu","age":23}, {"teacherid":"004","name":"zhaoliu","age",24}, ]) }catch(e){ print("err:"+e); }
-
更新操作
// 语法 db.teacher.update(query,updatedata,option) // 1. 覆盖修改 直接将对象更新为 第二个参数 db.teacher.update({name:"zhangsan"},{age:26}) // 2. 局部修改 使用$set db.teacher.update({name:"zhangsan"},{$set:{age:26}}); // 3. 批量修改 mongodb 默认只修改匹配的第一条数据 要想修改多条就要使用参数了 option db.teacher.update({name:"lisi"},{$set:{age:28}},{multi:true}) // 4. 列值增长 年龄增长一岁 db.teacher.update({name:"zhangsan"},{$inc:{age:1}})
-
删除文档
//语法 db.teacher.remove(条件) // 1.全部删除 谨慎使用 db.teacher.remove({}) // 2.条件删除 db.teacher.remove({teacherid:"003"})
分页查询
1. 统计查询
// 语法 db.teacher.count(query,options)
// 1. 查询全部
db.teacher.count();
// 2. 条件查询
db.teacher.count({name:"zhangsan"});
2. 分页查询
/*
* db.teacher.find().limit().skip()
* limit()读取指定数量的数据 默认20
* skip() 跳过指定数量的数据
*/
// 查询前两条
db.teacher.find({age:24}).limit(2)
// 查询第二页
db.teacher.find({age:24}).limit(2).skip(2)
3. 排序查询
使用sort()对数据进行排序,sort()中指定排序的字段,用1表示升序 -1表示降序
db.teacher.find().sort({age:1,name:-1})
复杂查询
1. 正则查询
Mongodb 支持js中的正则查询
db.teacher.find({name:/zh/})
db.teacher.find({name:/^zh/})
2. 比较查询
// 大于 >
db.teacher.find({age:{$gt:23}})
// 大于等于 >=
db.teacher.find({age:{$gte:23}})
// 小于 <
db.teacher.find({age:{$lt:23}})
// 小于等于 <=
db.teacher.find({age:{$lte:23}})
// 不等于 !=
db.teacher.find({age:{$ne:23}})
3. 包含查询
// 类比mysql in
db.teacher.find({age:{$in:[23]}})
//not in
db.teacher.find({age:{$nin:[23]}})
4. 条件连接查询
// and 查询 {$and:[{},{},{}]
db.teacher.find({$and:[{_id:{$gt:3}},{age:{$gt:24}}]})//id>3 并且 age>24
// or 查询 {$or:[{},{},{}]
db.teacher.find({$or:[{_id:{$gt:3}},{age:{$gt:24}}]})
索引
如果没有索引,MongoDB在执行查询的时候必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。MongoDB的索引采用B树的数据结构
1. 索引的类型
-
单字段索引
在单个字段上按照升序或降序创建索引
-
复合索引
在多个字段上创建索引,并且可以指定某个字段升序或降序
-
其他索引
地理空间索引、文本索引、哈希索引
2. 索引操作
1.查看索引
// 获取索引 以数据形式返回
db.teacher.getIndex();
// 返回结果
[
{
"v" : 2, // 索引版本
"key" : { // 索引的字段
"_id" : 1 // 以 _id 为索引 按升序排序
},
"name" : "_id_", // 索引名字
"ns" : "articledb.teacher" //命名空间
}
]
2.创建索引
// db.teacher.createIndex(keys,options);
// 创建单字段索引
db.class.createIndex({classid:1})
//获取索引
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "articledb.class"
},
{
"v" : 2,
"key" : {
"classid" : 1
},
"name" : "classid_1",//默认索引名称加排序方式
"ns" : "articledb.class"
}
]
// 创建复合索引
db.class.createIndex({classid:1,name:-1},{name:"class_name_index"})
//获取索引
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "articledb.class"
},
{
"v" : 2,
"key" : {
"classid" : 1
},
"name" : "classid_1",
"ns" : "articledb.class"
},
{
"v" : 2,
"key" : {
"classid" : 1,
"name" : -1
},
"name" : "class_name_index",//指定的索引名称
"ns" : "articledb.class"
}
]
3. 删除索引
// 语法 db.class.dropIndex(name); 可以根据名称去删 也可以根据具体的索引字段去删除
db.class.dropIndex({classid:1});
db.class.dropIndex("class_name_index");
// 删除所有索引
db.class.dropIndexes();
本文作者:观书喜夜长
本文链接:https://www.cnblogs.com/cnsure/p/15490444.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步