这一节是文档的创建,删除,修改,查询
概述
mongodb中数据的组织形式
mongodb文档 : 是以键值对的形成组成的一组数据。类似python中字典描述数据的方式
- 文档是bson数据类型
- 文档是由键值对构成
- 文档是MongoDB的基本单元
键
即文档的域,表达了一个键值对的含义
键的命名规则:
utf-8
格式字符串
- 不能使用
\0
- 一个文档中的键不能
重复
值
即文档存储的数据。
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 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 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()
|
删除文档
删除一条或多条文档
功能 : 删除文档
参数 :
- 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 2
| e.g. 找到名字为jpy的人,更改它的名字是lilei db.class.findOneAndUpdate({name:'Jpy'}, {$set:{name:'lilei'}})
|
查到到某个然后将其替换
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}})
|