A Backend Developer Who Lov|

观书喜夜长

园龄:3年4个月粉丝:0关注:4

MongoDB笔记(一)

MongoDB 简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

MongoDB 安装

  1. MongoDB官网下载mongodb,解压到本地文件夹

  2. 创建目录 datalog

  3. 新增配置文件

# 数据存放目录
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
  1. 启动MongoDB,在安装目录下执行 ./bin/mongod -f mongo.conf

  2. 连接测试mongo --host 127.0.0.1 --port 27017

数据库操作

  1. show dbs查看数据库或者使用show databases

  2. use dbname : 如果数据库不存在则创建数据库,否则切换到数据库

    要求:

    • 不能是空字符串

    • 不能含有特殊字符空格,点,$

    • 应该全部小写

    • 不超过64字节

    默认给我们提供的数据库:

    • admin:
    • local: 该数据库中的数据不会被复制,集群时不会相互复制
    • config:用于分片设置时,用于保存分片的相关信息
  3. db 查看当前的数据库

  4. db.dropDataBase 删除数据库

集合操作

  1. 显示创建集合 db.createCollection('name')
  2. 删除集合db.name.drop()
  3. 查看集合show collections

文档CRUD操作

  1. 文档插入insert()save()都可以,这样可以隐式的创建集合class

    db.class.insert({"classid":"001","name":"语文","teacher":"0001"})
    
  2. 插入多条insertMany(),使用数组插入,批量插入出错时,可以使用trycatch

    db.teacher.insertMany([
      {"teacherid":"001","name":"zhangsan","age":23},
      {"teacherid":"002","name":"lisi","age":24},
    ])
    
  3. 文档查询find()

    // 查询全部
    db.teacher.find();
    // 条件查询
    db.teacher.find({"name":"lisi"})
    // 投影查询   查询指定的列后一个参数指定列 1 代表查询  _id 可以通过指定0来排除
    db.teacher.find({name:"lisi"},{age:1,name:1,_id:0});
    
  4. 使用try catch 貌似没什么用,需要再查查

    try{
      db.teacher.insertMany([
        {"teacherid":"003","name":"wangwu","age":23},
        {"teacherid":"004","name":"zhaoliu","age",24},
      ])
    }catch(e){
      print("err:"+e);
    }
    
  5. 更新操作

    // 语法 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}})
    
    
  6. 删除文档

    //语法 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 中国大陆许可协议进行许可。

posted @   观书喜夜长  阅读(48)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起