MongoDB学习笔记

MongoDB、Redis 非关系型数据库,非关系型数据库, 称为NoSQL ,键值对存储的形似,适合存储海量的数据

学习MongoDB时,和MySQL有些变化

  • 数据库
  • 集合(对应MySQL中的数据表)
  • 文档(对应MySQL中的记录)
  • 域(对应MySQL中的字段)

1 MongoDB命令

开启客户端 sudo mongo (前提开启服务器)

​ 查看数据库 show dbs 或者 show databases

​ 查看使用的数据库 db

​ 切换数据库 use 数据库名字

​ 创建数据库 use 数据库名字

​ 删除数据库 db.dropDatabase()

注意:

  • 如果数据库不存在,则创建数据库,否则切换到指定数据库

  • 刚创建的数据库并不在数据库的列表中,如 要显示它,需要向数据库中插入一些数据,才会看到刚刚创建的数据库(即如果创建了数据库没有数据,show dbs看不到)

  • MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中

    集合相关命令:

​ 查看当前数据库中的所有集合(数据表)

​ show collections

​ 手动创建集合

​ db.createCollection(name, options)

​ demo :

db.createCollection("stu")

​ demo2:

db.createCollection("stu", {capped:true, size: 10})

说明:

  • 参数capped: 默认值为false表示不设置上限,值为true表示设置上限

  • 参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节

  • 查询集合上限与否 db.集合名.isCapped()

    删除集合:

    db.集合名.drop()

2 MongoDB 中常见数据类型

Object ID: ⽂档ID

String: 字符串, 最常⽤, 必须是有效的UTF-8

Boolean: 存储⼀个布尔值, true或false

Integer: 整数32位或64位, 这取决于服务器

Double: 存储浮点值

Arrays: 数组或列表, 多个值存储到⼀个键

Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档

Null: 存储Null值

Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数

Date: 存储当前⽇期或时间的UNIX时间格式

注意点:

​ object ID 中是一个12个字节的十六进制数,24位的字符串,它并不是一个随机数,每一对字节都有含义。 其中 前4个字节 8个字符是一个 ‘时间戳’, 接下来3个字节 ‘机器ID’ 往后2个字节是 MongoDB 的服务进程id , 最后三个字节是一个‘ 增值量’

3 MongoDB 增删改查

增:

​ MongoDB 使用 insert() 或 save() 向集合中添加(插入)文档

db.集合名称.insert({"键":“值”})

db.集合名称.save({"键":"值"})

​ demo:

查:

db.集合名称.find()

​ 易读方式查询 db.集合名称.find().pretty()

改(更新):

db.集合名称.update(<query>, <update>,{multi: <boolean>})

说明:

  • 参数query:查询条件
  • 参数update:更新操作符
  • 参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新

demo:

db.student.update({"name":"二哈"},{"name":"哈哈"})

demo:指定键值更新操作

db.stu.update({name:'hr'},{$set:{name:'hys'}})

demo:更新全部

db.stu.update({},{$set:{gender:0}},{multi:true})

删:

db.集合名称.remove(<query>, {"justOne":<boolean>})
说明:

  • 参数query:可选,删除的⽂档的条件
  • 参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条

demo:

db.student.remove({"name":"xxxx"})

进阶查询

数据准备:

{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }
{"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false }
{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false }
{"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true }
{"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true }
{"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true }
{"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }

# 一次性插入
db.stu.insertMany([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },{"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },{"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },{"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true },{"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true },{"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }])

db.student.findOne({文档条件}) 查询一条数据

1 比较运算符
  • 等于: 默认是等于判断, 没有运算符

  • ⼩于:$lt (less than)

  • ⼩于等于:$lte (less than equal)

  • ⼤于:$gt (greater than)

  • ⼤于等于:$gte

  • 不等于:$ne

demo:

db.集合名.find({age:{$gte:18}}) 查询大于等于 18年龄的信息

2 逻辑运算符
  • and 查询,在json中写多个条件

    查询年龄大于等于18 并且 gender 等于true

    db.student.find({age:{$gte:18},gender:true})

  • or 查询

查询年龄⼤于18, 或性别为false的学⽣

db.student.find({$or:[{age:{$gt:18}},{gender:false}]})

查询年龄⼤于18或性别为男⽣, 并且姓名是郭靖

db.student.find({$or:[{age:{$gt:18}},{gender:true}],"name":"郭靖"})

3 范围查询

使⽤$in$nin 判断数据是否在某个数组内(非连续性的)

查询年龄为18、28的学生

db.student.find({age:{$in:[18,28]}})

4 自定义查询
db.stu.find({
    $where:function() {
        return this.age>30;
    }
})

高级用法

1 limit() 读取文档的数量

获取2条学生的信息

db.student.find().limit(2)

2 skip() 用于跳过指定数量的文档

跳过前两个从第三个开始

db.student.find().skip(2)

3 skip和limit结合使用

先使用skip再使用limit 效率更高

db.student.find().skip(2).limit(3)

4 投影--- 在查询到的返回结果中,只选择必要的字段

命令:

db.集合名称.find({},{field:1,...})

说明:

  • 参数为字段和值, 值为1表示显示, 值为0不显
  • 特别注意: 对于_id列默认是显示的, 如果不显示需要明确设置为0

demo:

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

5 排序 sort()

db.student.find().sort({域:1.....})
说明:

  • 参数1为升序排列(从小到大) 参数-1为降序排列(从大到小)

6 统计个数 count()

db.student.find().count({条件})

7 消除重复

db.集合名称.distince("去重字段", {条件})

demo:

db.student.distinct("hometown",{age:{$gt:18}})

聚合函数

1 group分组

2 match数据过滤

4 索引

目的: 在查询数据中,如果有大量的数据时,为了能够加快速度的查询,那么我们就需要创建索引。

建立索引的注意点:

  1. 根据需要选择是否需要建立唯一索引

  2. 数据量巨大并且数据库的读出操作非常频繁的时候才需要创建索引,如果写入操作非常频繁,创建索引会影响写入速度

  3. 索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是在复合索引的条件下会有影响

    在进行查询的时候如果字段1需要升序的方式排序输出,字段2需要降序的方式排序输出,那么此时复合索引的建立需要把字段

5 MongoDB数据库备份

备份

保证数据库安全,主要用于灾难处理

备份的语法:mongodump -h dbhost -d dbname -o dbdirectory

  • -h: 服务器地址, 也可以指定端⼝号
  • -d: 需要备份的数据库名称
  • -o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据

示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢复

恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory

  • -h: 服务器地址
  • -d: 需要恢复的数据库实例
  • --dir: 备份数据所在位置

示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

6 MongoDB与Python交互

安装

pip install pymongo

使用pymongo

导入pymongo并选择要操作的集合

数据库和集合如果没有会自动创建

from pymongo import MongoClient
client = MongoClient(host,port)
collection = client[db名][集合名]

原文地址:https://www.cnblogs.com/kongguanghua/p/13373817.html