MongoDB-文档操作

这一节是文档的创建,删除,修改,查询

概述

mongodb中数据的组织形式

mongodb文档 : 是以键值对的形成组成的一组数据。类似python中字典描述数据的方式

  1. 文档是bson数据类型
  2. 文档是由键值对构成
  3. 文档是MongoDB的基本单元

即文档的域,表达了一个键值对的含义

键的命名规则:

  1. utf-8格式字符串
  2. 不能使用\0
  3. 一个文档中的键不能重复

即文档存储的数据。
bson支持的数据类型值

数据类型

类型
整型 整数 1 2 3
布尔类型 true false
浮点型 小数
Array 数组
Date 时间日期
Timestamp 时间戳
String 字符串
Symbol 特殊字符串
Binary data 二进制子串
Null null 空值
Object 内部文档(对象)
code js代码
regex 正则子串
ObjectId 自动生成ID标记
1
"_id" : ObjectId("5ba07671b17d2b40342f7c5c")

_id

当mongodb插入文档时如果不指定_id域则自动生成_id域。值如果不自己指定即会自动生成一个ObjectId值

24位16进制 使用ObjectId经过算法处理保证其唯一性

5ba07671 b17d2b 4034 2f7c5c
8位文档创建时间 6位 机器ID 4位进程id 6位计数器

文档中键值对是有序的
文档中键值对严格区分大小写

集合中的文档

  1. 集合中的文档不一定有相同的域

    • 个数不同
    • 域不相同
    • 数据类型不同
  2. 集合中文档各自比较独立,相互并不影响

集合创建原则

  1. 集合中的文档要描述同一类事物
  2. 数据库中同一类数据尽量集中存放在相同的集合
  3. 集合中的文档嵌套层数不要太多

插入文档

1
2
3
db.collection.insert()
功能 : 插入一个文档
参数 : 要插入的文档
1
2
e.g. 
db.class0.insert({'name':'Lucy',"age":18,"sex":'w'})

插入单个文档

1
2
3
db.class0.insert({_id:1,name:'Jame',age:16,sex:'m'})
或者
db.class0.insertOne({_id:1,name:'Jame',age:16,sex:'m'})
  • 插入操作中键可以不加引号
  • 查看插入结果 db.class0.find()
  • _id 值可以自己插入,但是不能重复

插入多条文档

参数用中括号里面放入多个文档

1
2
3
4
5
6
7
8
db.class0.insert([{},{},...])

db.class0.insertMany([])

e.g.
db.class0.insert([{name:"Alex",age:19,sex:'m'},{name:'Abby',age:18,sex:'w'}])

db.class0.insertMany([{name:"John",age:16,sex:'m'},{name:"Lenzer",age:17,sex:'m'}])

save插入文档

跟insert插入的区别就是,如果_id重复,save会覆盖,insert会报错

如果正常插入与insert用法相同

1
db.collection.save()
1
2
3
e.g.
db.class0.save({name:'Allen',age:19,sex:'m'})
db.class0.save([{name:"Sunny",age:17,sex:'w'},{name:'Alice',age:16,sex:'w'}])

如果插入数据是有_id域,且_id域值存在时则会修改原有文档,如果该值不存在则正常插入

1
db.class0.save({_id:2,name:'Mary',age:20,sex:'w'})

获取集合对象方法

1
2
3
4
db.class0  ===> db.getCollection('class0')

e.g.
db.getCollection("class0").find()

删除文档

删除一条或多条文档

1
remove(query,justOne)

功能 : 删除文档
参数 :

  • query 用法同find
  • justOne 布尔值 默认为false表示删除所有符合条 件的文档 设置为true则表示只删除一条
1
2
e.g. 删除所有不存在sex域的文档
db.class1.remove({sex:{$exists:false}})
1
2
e.g.  删除第一条性别为w的文档
db.class1.remove({sex:'w'},true)

删除集合中所有文档

1
2
e.g. 删除class1中所有文档
db.class1.remove({})

修改文档

更新单个文档

1
updateOne(query,update,upsert,multi)

功能 : 修改文档
参数 :

  • query 筛选条件 用法同find
  • update 要修改成什么内容 通常配合修改操作符 (修改器)使用
  • upsert 布尔值,默认是false 如果query没有筛 选到文档则不做任何操作
    如果设置为true 则如果query没有筛选到匹配文档则根据query和update内容插入新的文档
1
2
e.g.  将Tom的年龄修改为18
db.class0.update({name:'Tom'},{$set:{age:18}})
1
2
e.g.  如果有name=Jame的文档则修改,如果没有则根据         query update插入新的文档
db.class0.update({name:'Jame'},{$set:{age:15}},true)
1
2
e.g.  修改所有年龄小于17的为18
db.class0.update({age:{$lt:17}},{$set:{age:18}},false,true)

更新多个文档

1
updateMany(query,update,upsert)

查到到某个然后将其修改

1
db.findOneAndUpdate()
1
2
e.g. 找到名字为jpy的人,更改它的名字是lilei
db.class.findOneAndUpdate({name:'Jpy'}, {$set:{name:'lilei'}})

查到到某个然后将其替换

1
db.findOneAndReplace()
1
2
e.g. 找到名字是eveb的这个人,并且把替换文档
db.class.findOneAndReplace({name:"eveb"}, {name:'aaa', age:34})

修改器的使用

$set

修改一个值或者也可以增加一个域

1
2
e.g. 修改姓名ebal的年龄为49岁
db.class.updateOne({name:'ebal'}, {$set:{age:49}})
1
2
e.g. 修改姓名ebal的年龄为49岁, 性别为女,并且新增一个喜好的域
db.class.updateOne({name:'ebal'}, {$set:{age:49, sex:0, habby:[1, 2]}})

$unset

删除一个域

1
2
e.g. 删除名字Jpy的age域(字段)
db.class.updateMany({name:'Jpy'}, {$unset:{age:''}})

$rename

给一个域重命名

1
2
e.g. 当前集合中所有的sex域更名为gender
db.class.updateMany({}, {$rename:{sex:'gender'}})

$inc

加法修改器

1
2
e.g. 将所有人的年龄都加上1岁
db.class.updateMany({}, {$inc:{age:1}})

$mul

乘法修改器

1
2
e.g. 将所有人的年龄都成上3
db.class.updateMany({}, {$mul:{age:3}})

$max

指定一个值的下限

小于指定的值则修改该值,大于不变

1
2
e.g. 将所有人的年龄小于18的都修改为18
db.class.updateMany({}, {$max:{age:18}})

$min

指定一个值的上限

大于指定的值则修改该值,小于不变

1
2
e.g. 将所有人的年龄大于18的都修改为18
db.class.updateMany({}, {$min:{age:18}})

$setOnInsert

如果使用update插入了文档,则将该修改器内容作为插入文档的一部分

1
2
e.g.  如果插入了新文档则setOnInsert内容也会作为新文档一部分
db.class0.update({name:'Jame'},{$set:{age:18},$setOnInsert:{gender:'m',tel:'123456'}},true)

数组修改器

$push

向数组中添加一项

1
2
e.g.  给小红 score数组中添加一项91
db.class1.update({name:'小红'},{$push:{score:91}})

$pushAll

向数组中添加多项

1
2
e.g.
db.class1.update({name:'小乔'},{$pushAll:{score:[94,10]}})

$pull

从数组中删除一项

1
2
e.g.  从数组中删除一项
db.class1.update({name:'小红'},{$pull:{score:78}})

$pullAll

从数组中删除多项

1
2
e.g.
db.class1.update({name:'小乔'},{$pullAll:{score:[92,10]}})

$each

对多个值逐个进行操作

1
2
e.g.  分别插入99  10
db.class1.update({name:'小乔'},{$push:{score:{$each:[99,10]}}})

$position

指定插入位置

1
2
e.g.  将67 插入到数组1号位置
db.class1.update({name:'小明'},{$push:{score:{$each:[67],$position:1}}})

$sort

数组排序

1
2
e.g.  将说有score域的数组降序排序
db.class1.update({},{$push:{score:{$each:[],$sort:-1}}},false,true)

$pop

弹出一项 1表示弹出最后一项 -1弹出第一项

1
2
e.g.  删除小明score中第一项
db.class1.update({name:'小明'},{$pop:{score:-1}})

$addToSet

向数组中添加一项 但是不能添加重复的内容

1
2
e.g. 如果数组中没有81 则添加81
db.class1.update({name:'小刚'},{$addToSet:{score:81}})