MongoDB文档
以键值对的形成组成的一组数据
键与值
- 键:文档的域,表达了一个键值对的含义
- 值:即文档存储的数据
键的命名规则
-
utf-8
格式字符串 - 不能使用
'\0'
- 一个文档中的键不能重复
键值对的规则
- 文档中键值对是有序的
- 文档中键值对严格区分大小写
MongoDB数据类型
/*
类型 值
整型 整数 1 2 3
布尔类型 true false
浮点型 小数
Array 数组
Date 时间日期
Timestamp 时间戳
String 字符串
Symbol 特殊字符串
Binary data 二进制子串
Null null 空值
Object 内部文档(对象)
code js代码
regex 正则子串
ObjectId 自动生成ID标记
*/
ObjectId
- 当mongodb插入文档时如果不指定
_id
域则自动生成_id
域 - 值如果不自己指定即会自动生成一个
ObjectId
值 -
ObjectId
值:24位16进制,使用ObjectId
经过算法处理保证其唯一性,8位文档创建时间 ,6位机器ID,4位进程id,6位计数器
集合中的文档
- 集合中的文档不一定有相同的域
- 个数不同
- 域不相同
- 数据类型不同
- 集合中文档各自比较独立,相互并不影响
集合创建原则
- 集合中的文档要描述同一类事物
- 数据库中同一类数据尽量集中存放在相同的集合
- 集合中的文档嵌套层数不要太多
插入文档
- 插入操作中键可以不加引号
- 查看插入结果
db.collection_name.find()
-
_id
值可以自己插入,但是不能重复
/*
功能:插入一个文档
参数:要插入的文档
*/
db.collection.insert()
插入单个文档
// 插入单个文档
db.class0.insert({'name':'Lucy',"age":18,"sex":'w'})
db.class0.insert({_id:1,'name':'Jame',age:16,sex:'m'})
// 使用 insertOne() 插入单个文档
db.class0.insert({'name':'Lucy',"age":18,"sex":'w'})
插入多条文档
插入多条文档时,参数用中括号里面放入多个文档
// 插入多条文档
db.class0.insert([{name:"Alex",age:19,sex:'m'},{name:'Abby',age:18,sex:'w'}])
// 使用 insertMany() 插入多个文档
db.class0.insertMany([{name:"John",age:16,sex:'m'},{name:"Lenzer",age:17,sex:'m'}])
save插入文档
// 正常插入与insert用法相同
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域值存在时则会修改原有文档,如果该值不存在则正常插入
// 如果 _id = 2 存在的域存在,则覆盖之前的
db.class0.save({_id:2,name:'Mary',age:20,sex:'w'})
获取集合对象方法
db.class0 <===> db.getCollection('class0')
// 以下代码相当于 db.class0.find()
db.getCollection("class0").find()
删除文档
db.collection.remove(query,justOne)
/*
remove(query,justOne)
功能:删除文档
参数:query 删除条件
justOne 布尔值
默认为false表示删除所有符合条件的文档
设置为true则表示只删除一条
*/
// 删除所有不存在sex域的文档
db.class1.remove({sex:{$exists:false}})
// 删除第一条性别为w的文档
db.class1.remove({sex:'w'},true)
// 删除所有_id类型不是ObjectId类型的文档
db.class1.remove({_id:{$not:{$type:7}}})
// 删除集合中所有文档 db.collection.remove({})
// 删除class1中所有文档
db.class1.remove({})
修改文档
db.collection.update(query,update,upsert,multi)
/*
update(query,update,upsert,multi)
功能:修改文档
参数::
query 筛选条件
update 要修改成什么内容通常配合修改操作符 $set (修改器)使用
upsert 布尔值
默认是false 如果query没有筛选到文档则不做任何操作
如果设置为true 则如果query没有筛选到匹配文档则根据query和update内容插入新的文档
multi 布尔值
默认false 表示如果有多条符合条件文档则只修改第一条
如果设置为true则表示修改所有符合条件文档
*/
// 将Tom的年龄修改为18
db.class0.update({name:'Tom'},{$set:{age:18}})
// 如果有name=Jason的文档则修改,如果没有则根据query update插入新的文档
db.class0.update({name:'Jason'},{$set:{age:24}},true)
// 修改所有年龄小于17的为18
db.class0.update({age:{$lt:17}},{$set:{age:18}},false,true)
修改操作符(修改器)
-
$set
修改一个域的值 / 增加一个域
// Lily年龄修改为17
db.class0.update({name:'Lily'},{$set:{age:17}})
// 为Jame增加sex域
db.class0.update({name:'Jame'},{$set:{sex:'m'}})
-
$unset
删除一个域
// 删除Abby的sex域,sex后为空字符串
db.class0.update({name:'Abby'},{$unset:{sex:''}})
-
$rename
修改域的名称
// 将sex域名改为gender,默认修改一个
db.class0.update({},{$rename:{sex:'gendar'}},false,true)
-
$setOnInsert
如果使用update
插入了文档,则将该修改器内容作为插入文档的一部分
// 如果插入了新文档则setOnInsert内容也会作为新文档一部分
db.class0.update({name:'Jame'},{$set:{age:18},$setOnInsert:{gendar:'m',tel:'1234545'}},true)
-
$inc
加法修改器
// 所有人年龄加1
db.class0.update({},{$inc:{age:1}},false,true)
-
$mul
乘法修改器
// 参数可以是正数,负数,整数,小数
// 所有人年龄乘以0.5
db.class0.update({},{$mul:{age:0.5}},false,true)
-
$min
如果筛选文档的指定域值小于min
值则不修改,大于min
值则修改为min
值
// Levi age如果大于20则修改为20
db.class0.update({name:'Levi'},{$min:age:20})
-
$max
如果筛选文档的指定域值大于max
值则不修改,小于max
值则修改为max
值
数组修改器
db.class2.insert({name:'小红',age:9,score:[78,89]})
db.class2.insert({name:'小明',age:9,score:[88,89]})
db.class2.insert({name:'小刚',age:9,score:[88,75]})
db.class2.insert({name:'小乔',age:9,score:[97,92]})
-
$push
向数组中添加一项
// 给小红 score数组中添加一项91
db.class2.update({name:'小红'},{$push:{score:91}})
-
$pushAll
向数组中添加多项
// 给小乔 score数组中添加两项91,10
db.class2.update({name:'小乔'},{$pushAll:{score:[94,10]}})
-
$pull
从数组中删除一项
// 从小红 score数组中删除78
db.class2.update({name:'小红'},{$pull:{score:78}})
-
$pullAll
从数组中删除多项
// 从小乔 score数组中添加两项92,10
db.class2.update({name:'小乔'},{$pullAll:{score:[92,10]}})
-
$each
对多个值逐个进行操作
// 给小乔 score 分别插入99 10
db.class2.update({name:'小乔'},{$push:{score:{$each:[99,10]}}})
-
$position
指定插入位置,需配合$each
使用
// 给小明 将67插入到数组1号位置
db.class2.update({name:'小明'},{$push:{score:{$each:[67],$position:1}}})
-
$sort
数组排序
// 将所有score域的数组降序排序
db.class2.update({},{$push:{score:{$each:[],$sort:-1}}},false,true)
-
$pop
弹出一项,1
表示弹出最后一项,-1
弹出第一项
// 删除小明score中第一项
db.class2.update({name:'小明'},{$pop:{score:-1}})
-
$addToSet
向数组中添加一项,但是不能添加重复的内容
// 给小刚 如果score数组中没有81 则添加81,如果有则报错
db.class2.update({name:'小刚'},{$addToSet:{score:81}})