MongoDB 《MongoDB 基础教程》实验报告

53 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

image.png

image.png

创建数据库

# 格式
> use 数据库名称
# 例如
> use school

创建集合

  • 创建一个普通的集合
# 格式
> db.createCollection(集合名称)
# 例如
> db.createCollection("student")
  • 创建一个带参数的集合
# 格式
> db.createCollection(集合名称,可选参数)
# 例如
> db.createCollection("subject", {autoIndexId:true} )
可选参数类型说明
autoIndexIdbool默认为 false,如果设置为 true,则会在 _id 字段上自动创建索引
cappedbool如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小
sizeint如果 capped 为 true 则需要指定,指定参数的最大值,单位为 byte
maxint指定最大的文档数

插入文档

  • 插入 student 文档
> db.student.insert([ 
{name:"小兰",gender:"女",age:18 },
{name:"新一",gender:"男",age:18 }
])
  • 插入 subject 文档
> subject_list = [{"name":"算数"},{"name":"图画"},{"name":"体育"}]
> db.subject.insert(subject_list)

更新文档

  • 根据 _id 更新
# 格式
> db.集合名称.save({_id:ObjectId(文档的_id),key:value})
# 例如
> db.student.save({_id:ObjectId("5f3633a5a36e80089d0c495d"),"name":"新一","gender":"男"})

根据 _id 更新会替换之前的文档,而非只更新某个字段。

  • 根据筛选项更新
# 格式
> db.集合名称.update( {key1:value1},{$set:{key2:value2}} )
# 例如
> db.student.update( {"age":18},{$set:{"age":19}},{multi:true} )

update 默认只对一个文档更新,更新所有文档需要添加 multi:true。

查询文档

  • 查询所有
# 格式
> db.集合名称.find()
# 例如
> db.student.find()
  • AND 查询
# 格式
> db.集合名称.find({ key: value })
# 例如
> db.student.find({ "name": "小兰" })
  • OR 查询
# 格式
> db.集合名称.find({ $or: [{key1: value1},{key2: value2}] })
# 例如
> db.student.find({ $or: [{"name": "柯南"},{"name": "新一"}] })
  • 条件查询
# 格式
> db.集合名称.find({ key: {条件操作符:value} })
# 例如
> db.student.find({ "age": {$gte:18} })
条件操作符含义
$lt小于
$gt大于
$lte小于等于
$gte大于等于
$ne不等于
  • 模糊查询
# 匹配前缀格式
> db.集合名称.find({ key:"/^value/" })
# 例如
> db.student.find({ "age":"/^1/" })
# 匹配后缀格式
> db.集合名称.find({ key:"/value$/" })
# 例如
> db.student.find({ "name":"/$兰/" })
  • 数据类型查询
# 格式
> db.集合名称.find({ key:{$type:value} })
# 例如
> db.student.find({ "name":{$type:"string"} })
# 等同于
> db.student.find({ "name":{$type:2} })
类型值数据类型类型别名
1双精度型(Double)double
2字符串(String)string
3对象(Object)object
4数组(Array)array
5二进制数据(Binary data)binData
7对象 ID(Object id)objectId
8布尔类型(Boolean)bool
9日期(Date)date
10空(Null)null
11正则表达式(Regular Expression)regex
13JS 代码(Javascript)javascript
14符号(Symbol)symbol
15有作用域的 JS 代码(JavaScript with scope)javascriptWithScope
1632 位整型数(32-bit integer)int
17时间戳(Timestamp)timestamp
1864 位整型数(64-bit integer)long
-1最小值(Min key)minKey
127最大值(Max key)maxKey
  • 限制查询
# 格式
> db.集合名称.find().limit(value)
# 例如
> db.student.find().limit(1)
  • 跳过查询
# 格式
> db.集合名称.find().skip(value)
# 例如
> db.student.find().skip(1)
  • 排序查询
# 格式
> db.集合名称.find().sort({key:value})
# 例如
> db.student.find().sort({"name":1})    # 1表示升序
> db.student.find().sort({"age":-1})    # -1表示降序
  • 聚合查询
# 格式
> db.集合名称.aggregate(可选参数)
# 例如
> db.student.aggregate([{
$group:{_id:"$age", count:{$sum:1}}
}])
可选参数说明
$match查询,跟 find 一样
$limit限制显示结果数量
$skip忽略结果数量
$sort排序
$group按照给定表达式组合结果
聚合表达式说明
$sum计算总和
$avg计算平均值
minmin 和 max计算最小值和最大值
$push在结果文档中插入值到一个数组
$addToSet在结果文档中插入值到一个数组,但不创建副本
$first根据资源文档的排序获取第一个文档数据
$last根据资源文档的排序获取最后一个文档数据

文档的关系

  • 嵌入式关系
{
   "name": "小兰",
   "age": 18,
   "gender": "女",
   "subject":
    [
       {
       "name": "图画 "
       }
    ]
}

把 subject 文档嵌入到 student 文档中,嵌入式关系比较适合一对一的情况。

  • 引用式关系
{
   "name": "新一",
   "age": 18,
   "gender": "男",
   "subject_ids": [
      ObjectId("5f36426fa36e80089d0c4960"),
      ObjectId("5f36426fa36e80089d0c4962")
   ]
}

通过引用 subject 文档的 _id 来与 student 文档建立关系,引用式关系比较适合一对多或者多对多的情况。

创建索引

  • 创建一个普通索引
# 格式
> db.集合名称.ensureIndex({key:value})
# 例如
> db.student.ensureIndex({"name":1})    # 1表示升序
> db.student.ensureIndex({"age":-1})    # -1表示降序
  • 创建一个联合索引
# 格式
> db.集合名称.ensureIndex({key1:value1,key2:value2})
# 例如
> db.student.ensureIndex({"name":1,"age":1})
  • 创建一个带参数的索引
# 格式
> db.集合名称.ensureIndex({key:value},可选参数)
# 例如
> db.student.ensureIndex({"name":1},{unique:true})
可选参数类型说明
backgroundBoolean建立索引要不要阻塞其他数据库操作,默认为 false
uniqueBoolean建立的索引是否唯一,默认 false
namestring索引的名称,若未指定,系统自动生成
dropDupsBoolean建立唯一索引时,是否删除重复记录,默认 flase
sparseBoolean对文档不存在的字段数据不启用索引,默认 false
expireAfterSecondsinteger设置集合的生存时间,单位为秒
vindex version索引的版本号
weightsdocument索引权重值,范围为 1 到 99999
default-languagestring默认为英语
language_overridestring默认值为 language

验证索引

  • 验证覆盖索引
# 格式
> db.集合名称.find({key:value}).explain()
# 例如
> db.student.find({"name":"小兰"}).explain()
  • 验证指定索引
# 格式
> db.集合名称.find({key:value}).hint({key:value}).explain()
# 例如
> db.student.find({"name":"小兰"}).hint({name:1}).explain()