最全 MongoDB 基础教程

2021-02-18  本文已影响0人  若尘___

MongoDB

创建数据库

- 格式:use DATABASE_NAME
    - use ruochen
    - db

创建数据库需要插入一条数据才会在列表中显示
- db.ruochen.insert({'name': '若尘'})
- show dbs

删除数据库

创建集合

- 格式:db.createCollection(name, options)
- name: 要创建的集合名称
- options: 可选参数,指定有关内存大小及索引的选项
字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段

实例
# 在test数据库中创建ruochen 集合
use test
db.createCollection('ruochen')
# 查看已有集合
show collections

db.createCollection('test', {capped: true, autoIndexId: true, size: 1024000, max: 10000})  # autoIndexId 已弃用,默认_id添加索引

# 插入文档时,MongoDB会自动创建集合
db.ruochen.insert({'name': 'ruochen'})

删除集合

插入文档

更新文档

格式
db.collection.update(
    <query>,
    <update>,
    {
        upsert: <boolean>,
        multi: <boolean>,
        writeConcern: <ducument>
    }
)

query: update的查询条件,类似sql update查询内where后面的
update: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern: 可选,抛出异常的级别

案例
db.ruochen.insert({
    title: 'mongodb',
    description: 'Nosql 数据库',
    by: 'ruochen',
    tags: ['mongodb', 'databases', 'NoSQL']
})

db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}})  # 只会修改第一条发现的文档
db.ruochen.find().pretty()

db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}}, {multi:true})  # 修改多条相同的文档


save() 方法: 通过传入的文档来替换已有文档
格式
db.collection.save(
    <document>,
    {
        writeConcern: <document>
    }
)
document: 文档数据
writeConcern: 可选,抛出异常的级别

案例
db.ruochen.save({
    "_id" : ObjectId("5e631a14c17b253e9cef40cc"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "Runoob",
    "url" : "http://www.runoob.com",
    "tags" : [
            "mongodb",
    ]
})
db.ruochen.find().pretty()

删除文档

语法:
db.collection.remove(
    <query>,
    <justOne>
)

2.6版本以后语法格式
db.collection.remove(
    <query>
    {
        justOne: <boolean>,
        writeConcern: <document>
    }
)

参数说明
query: (可选) 删除的文档的条件
justOne: (可选) 如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档
writeConcern: (可选) 抛出异常的级别

db.ruochen.remove({'title': 'mongodb'})

# 只删除第一条找到的记录
db.COLLECTION_NAME.remove(DELETION_CRITHRIA, 1)

# 删除所有数据
db.ruochen.remove({})
db.ruochen.find()

# remove() 方法 并不会真正释放空间
# 需要执行db.repairDatabase() 来回收磁盘空间
db.repairDatabase()
db.runCommand({repairDatabase: 1})

remove方法已经过时
# 删除集合下所有文档
db.ruochen.deleteMany({})
# 删除 num 等于1 的全部文档
db.ruochen.deleteMany({num: '1'})
# 删除 num 等于1 的一个文档
db.ruochen.deleteOne({num: '1'})

查询文档

语法:
db.collection.find(query, projection)
参数说明
query: 可选,使用查询操作符指定查询条件
projection: 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)

# 以易读的方式读取数据
db.ruochen.find().pretty()
操作 格式 范例 RDBMS中的类似语句
等于 {key:value} db.ruochen.find({'by':'ruochen'}).pretty() where by = 'ruochen'
小于 {key:{$lt: value}} db.ruochen.find({'likes': {$lt:3}}).pretty() where likes < 3
小于或等于 {key:{$lte: value}} db.ruochen.find({'likes': {$lte:2}}).pretty() where likes <= 2
大于 {key:{$gt: value}} db.ruochen.find({'likes': {$gt:100}}).pretty() where likes > 100
大于等于 {key:{$gte: value}} db.ruochen.find({'likes': {$gte:200}}).pretty() where likes >= 200
不等于 {key:{$ne: value}} db.ruochen.find({'likes': {$ne:200}}).pretty() where likes != 200

AND条件

类似于 where by='ruochen' and likes=200

or条件

AND和OR联合

条件操作符

db.ruochen.insert({
    title: 'python',
    description: 'i love python',
    by: 'ruochen',
    url: 'xxx',
    tags: ['python'],
    likes: 200
})

db.ruochen.insert({
    title: 'php',
    description: 'php是世界上最好的语言',
    by: 'ruochen',
    url: 'xxx',
    tags: ['php'],
    likes: 150
})

db.ruochen.insert({
    title: 'MondoDB',
    description: 'NoSQL数据库',
    by: 'ruochen',
    url: 'xxx',
    tags: ['mongodb'],
    likes: 100
})

# 获取 'ruochen' 集合中 'likes' 大于100的数据
db.ruochen.find({likes: {$gt: 100}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes > 100;


获取 'ruochen' 集合中 'likes' 大于等于100的数据
db.ruochen.find({likes: {$gte: 100}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes >= 100;


# 获取 'ruochen' 集合中 'likes' 小于150的数据
db.ruochen.find({likes: {$lt: 150}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes < 150;


# 获取 'ruochen' 集合中 'likes' 小于等于150的数据
db.ruochen.find({likes: {$lte: 150}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes <= 150;

MongoDB 使用 (<) 和 (>) 查询 - lt 和gt

模糊查询

MongoDB $type 操作符

类型 数字 备注
Double 1  
String 2  
Object 3  
Array 4  
Binary data 5  
Undedined 6 已废弃
Object id 7  
Boolean 8  
Date 9  
Null 10  
Regular Experssion 11  
JavaScript 13  
Symbol 14  
JavaScript(with scope) 15  
32-bit integer 16  
Timestamp 17  
64-bit integer 18  
Min key 255 Query with -1
Max key 127  

Limit与Skip方法

Limit() 方法

Skip() 方法

skip() 方法默认参数为0

MongoDB 排序

skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。

MongoDB 索引

createIndex() 接收可选参数,可选参数列表如下

Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称
dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language

MongoDB聚合

aggregate() 方法

聚合表达式

表达式 描述 实例
$sum 计算总和 db.ruochen.aggregate([{group: {_id: "by", num_tutorial: {sum: "likes"}}}])
$avg 平均值 db.ruochen.aggregate([{group: {_id: "by", avg: {avg: "likes"}}}])
$min 获取集合中所有文档对应值的最小值 db.ruochen.aggregate([{group: {_id: "by", min: {min: "likes"}}}])
$max 获取集合中所有文档对应值的最大值 db.ruochen.aggregate([{group: {_id: "by", min: {max: "likes"}}}])
$push 在结果文档中插入值到一个数组中 db.ruochen.aggregate([{group: {_id: "by", url: {push: "url"}}}])
$addToSet 在结果文档中插入值到一个数组中,但不创建副本 db.ruochen.aggregate([{group: {_id: "by", url: {addToSet: "url"}}}])
$first 根据资源文档的排序获取第一个文档数据 db.ruochen.aggregate([{group: {_id: "by", url: {first: "url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.ruochen.aggregate([{group: {_id: "by", url: {last: "url"}}}])

管道

举例

当 match 条件和 group 同时存在时,顺序会影响检索结果,必须先写 match 在前面

上一篇 下一篇

猜你喜欢

热点阅读