插入文档
插入单个文档
db.<集合>.insert(<JSON对象>)
db.<集合>.insertOne(<JSON对象>)
db.<集合>.save(<JSON对象>)
insert函数
语法格式:db.COLLECTION_NAME.insert(document)
db.bbs.insert({
"title":"hello Java",
"description":"Java Study",
"by":"Mike",
"url":"www.java.com",
"tag":["computer","program","java"],
"likes":1001,
"comments":[{
"users":"sansansun",
"messages":"very good book",
"dateCreated":new Date(),
"like":true
},{
"users":"sunsun",
"messages":"very bad book",
"dateCreated":new Date(),
"like":false
}]
})
1)bbs集合如果不存在,则会隐式创建
2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
3)插入当前日期使用 new Date()
4)插入的数据没有指定 _id ,会自动生成主键值 ,类型为Objectid。如果自己指定_id字段,值不能重复,为数字和字符串类型。5)如果某字段没值,可以赋值为null,或不写该字段。
执行后,WriteResult({“nInserted”:1}),说明插入一个数据成功了。
注意:
1. 文档中的键/值对是有序的。
2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3. MongoDB区分类型和大小写。
4. MongoDB的文档不能有重复的键。
5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。 键默认是字符串,这里可以用双引号,也可以不用双引号。
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
insert函数\save函数\insertOne函数
db.comment.insert({"articleid":"100000","content":"Hello","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null})
db.comment.save({"articleid": "100001",
"content": "Word",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(20),
"state": null})
db.comment.insertOne({"articleid": "100001",
"content": "World",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(15),
"state": null})
数据类型
插入多个文档
向集合中批量插入多个文档时,使用数组来存放文档。
语法格式:
db.<集合>.insertMany/insert/save([<JSON对象1>,<JSON对象2>,<JSON对象3>,<JSON对象4>...<JSON对象n>])
db.COLLECTION_NAME.insert([{},{},{}])
db.COLLECTION_NAME.save([{},{},{}])
db.COLLECTION_NAME.insertMany([{},{},{}])
db.test.insert([{_id:1,name:"abc"},{_id:2,name:"bcd"}])
db.test.insertMany([{_id:3,name:"cde"},{_id:4,name:"def"}])
db.dev.save([{title:"Java",tags:["JavaSE","JavaME","JavaEE"]},{title:"Sprint",tags:["Spring MVC","Spring Boot","Spring Cloud"]}])
通过变量插入文档
通过变量插入单个文档
Mongo Shell工具允许定义变量。所有的变量都是var类型,也可忽略变量类型。变量中赋值符号后侧需要使用小括号表示变量中的值,可以将变量作为任意插入文档的函数的参数。变量生命周期仅在当前连接。
语法格式:变量名=({变量值})
var stuData=({
"name":"Mini",
"sex":"Male",
"address":"New York",
"age":15
})
db.students.insert(stuData)
通过变量插入多个文档
语法结构:变量名=([{},{},{}])
将多个文档放入一个变量中,进行插入。
stuData2=([{
"name":"Mini",
"sex":"Male",
"address":"New York",
"age":15},
{"name":"Max",
"sex":"Male",
"address":"New York",
"age":15}])
db.students.insert(stuData2)
快速插入数据
快速插入1000条数据
for(var x=1;x<1001;x++){ db.test.insert({"sno":"2024"+x}) } db.test.count()
查看文档
db.bbs.find()
db.bbs.find().pretty()
更新文档
MongoDB通过update函数或者save函数更新集合中的文档。
save()函数更新文档
save()方法通过传入的文档替换已有文档。id值相同的,用新的文档替换旧的文档。
语法格式:save({文档})更新1008文档 db.students.save({"_id":"1008","course":"english","credit":2})
update函数更新文档
update()函数用于更新已经存在的文档。
语法:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})
update(criteria,objNew,upsert,multi)
criteria:更新的查询条件,类似SQL里where条件
objNew:更新的值包括操作符,类似SQL里set后的值
upsert:boolean,true更新记录不存在则作为新记录插入,false不插入,默认是false
multi:boolean,true查找到的多条记录都更新,false只更新第一条记录,默认false
数据准备
db.students.drop()
db.students.insert({"_id":1001,"name":"张三","sex":"男","age":19,address:"宛城区"})
db.students.insert({"_id":1002,"name":"李四","sex":"女","age":20,address:"卧龙区"})
db.students.insert({"_id":1003,"name":"王五","sex":"男","age":19,address:"高新区"})
db.students.insert({"_id":1004,"name":"赵六","sex":"女","age":17,address:"宛城区"})
db.students.insert({"_id":1005,"name":"田七","sex":"女","age":17,address:"宛城区"})
db.students.insert({"_id":1006,"name":"田七","sex":"男","age":27,address:"卧龙区"})
db.students.insert({"_id":1007,"name":"钱八","sex":"女","age":21,address:"卧龙区"})
db.students.insert({"_id":1008,"name":"金九","sex":"女","age":20,address:"高新区"})
db.students.insert({"_id":1009,"name":"银十","sex":"男","age":18,address:"高新区"})
db.students.insert({"_id":1010,"name":"张三","sex":"女","age":18,address:"高新区"})
覆盖修改
更新1001学生姓名为Mike
db.students.update({"_id":1001},{"name":"Mike"})
更新姓名为张三的记录,更改其姓名为Mike
db.students.find({"name":"张三"})
db.students.update({"name":"张三"},{"name":"Mike"})
只更新一条记录,而且其他列的值都不见了,操作是{"name":"Mike"}文档替换了第一个姓名为张三的文档,这种方式使用文档替换的方式
db.students.update({"name":"田七"},{"name":"Rose","sex":"女"})
update更新时,更新内容覆盖更新对象,更新内容不包含的内容则全部清除。
局部修改
只更新部分数据,需要用到修改器
db.students.update({"name":"张三"},{$set:{"name":"Mike"}}) db.students.find({"name":"Mike"})
更新操作符
$set $set修改器用来修改指定一个键的值。如果这个键不存在,则创建(完成属性键值对的添加)。
$inc $inc修改器用来增加已有键的值,或者键不存在时创建一个键,只能用于整数、长整数或双精度浮点数。
$rename $rename修改器可以重命名字段名称。
$unset $unset修改器用来删除指定字段。
$set操作符
$set操作符:用来指定一个键并更新键值,若键不存在并创建。
语法格式:db.COLLECTION_NAME.update({查询条件},{更新操作符:{更新内容}})
db.students.update({"name":"Mike"},{$set:{"age":4,"interset":"english"}}) db.students.update({"name":"李四"},{$set:{"hobby":["basketball","football"]}}) db.students.update({"name":"李四"},{$set:{"hobby":["reading","swimming"]}})
$inc操作符
$inc 操作符(increment的缩写):可以对文档的某个值为数字型的键进行增减的操作。
更新李四的年龄,增大10岁 db.students.update({"name":"李四"},{$inc:{"age":10}}) 更新李四的年龄,减小5岁 db.students.update({"name":"李四"},{$inc:{"age":-5}}) db.students.update({"name":"李四"},{$inc:{"address":-5}}) //报错,只能用于数值型 更新李四的体重,不存在该键则创建该键 db.students.update({"name":"李四"},{$inc:{"weight":50}})
$rename
更改1001的interset列名为hobby
db.students.update({"_id":1001},{$rename:{"interset":"hobby"}})
重命名1008的name列为sname
db.students.update({"_id":1008},{$rename:{"name":"sname"}})
$unset操作符
$unset操作符主要是用来删除键。
删除1001的hobby字段 db.students.update({"_id":1001},{$unset:{"hobby":1}}) $unset:{"hobby":1} 只关注key键值,这里的value可以任意设置,表示占位
multi批量更新
在更新文档时,可以使用multi参数实现批量更新。
更新所有匹配条件的记录 第四个参数设置为true
db.students.update({"name":"Mike"},{$set:{"name":"Monica"}},{multi:true}) db.students.update({"sex":"男"},{$set:{"age":25}},false,true) db.students.update({},{$push:{"score":{$each:[91,92]}}})
数组更新
数据准备
db.students.drop() db.students.insertMany([ {"_id":"1001","name":"张三","address":"卧龙区",course:["Java","MySQL","mongoDB"]}, {"_id":"1002","name":"李四","address":"卧龙区",course:["Java","mongoDB"]}, {"_id":"1003","name":"王五","address":"宛城区",course:["Java","Hadoop"]}, {"_id":"1004","name":"赵六","address":"宛城区",course:["Linux","MySQL"]}, {"_id":"1005","name":"田七","address":"卧龙区",course:["Python","JS"]}, {"_id":"1006","name":"钱八","address":"高新区",course:["Java","MySQL"]}, {"_id":"1007","name":"张三","address":"高新区",course:["Java","MySQL","mongoDB"]}, {"_id":"1008","name":"张三","address":"高新区"} ])
$push |
在指定字段中添加某个值 |
$each |
一次性追加多个内容到数组里面 |
$slice |
限制$push操作符中数组内元素的数量 |
$addToSet |
向数组里面增加一个内容,只有这个内容不存在的时候才会增加 |
$pop |
删除数组内的数据,-1删除第一个,1删除最后一个 |
$pull |
从数组中删除所有指定的值或者符合给定条件的值 |
$push
$push操作符:只能用于数组元素中,向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键。
为王五添加一门课程C语言(push字段是数组,添加字段直接到数组中) db.students.update({"name":"王五"},{$push:{"course":"C语言"}}) 为钱八添加score字段,里面有一个成绩95(如果字段不存在,则直接将字段设置为数组) db.students.update({"name":"钱八"},{$push:{"score":95}}) 为李四的地址加入宛城区(push字段不是数组,抛异常) db.students.update({"name":"李四"},{$push:{"address":"宛城区"}}) 出错原因 address字段必须是数组,$push只能用于数组元素中 为钱八的score成绩加两个成绩[87,50] db.students.update({"name":"钱八"},{$push:{"score":[87,50]}}) 为钱八的score成绩加两个成绩87,50 db.students.update({"name":"钱八"},{$push:{"score":{$each:[87,50]}}})
$each和$slice
$each不能单独使用需要和其他修改器一起使用
$slice为正数,表示保留前面几个数
$slice为负数,表示保留后面几个数
$slice为0,表示清空数组
清空钱八的所有成绩 db.students.update({"name":"钱八"},{$push:{"score":{$each:[],$slice:0}}}) 为钱八的score成绩添加[38,59,97]三个成绩,只保留前面两个 db.students.update({"name":"钱八"},{$push:{"score":{$each:[38,59,97],$slice:2}}}) 为钱八的score成绩添加[38,59,97]三个成绩,只保留后面两个 db.students.update({"name":"钱八"},{$push:{"score":{$each:[38,59,97],$slice:-2}}})
$addToSet
$addToSet 向数组添加不重复的数据
为钱八的score成绩添加87和74两个成绩,不重复的需要用addToSet修改器 db.students.update({"name":"钱八"},{$push:{"score":87}}) db.students.update({"name":"钱八"},{$addToSet:{"score":87}}) db.students.update({"name":"钱八"},{$addToSet:{"score":74}}) 为钱八的score成绩添加74和66两个成绩 db.students.update({"name":"钱八"},{$addToSet:{"score":74}}) db.students.update({"name":"钱八"},{$addToSet:{"score":66}}) db.students.update({"name":"钱八"},{$addToSet:{"score":[74,66]}}) [74,66]作为一个元素 [74,66]依次作为成绩添加 需要用到each修改器 db.students.update({"name":"钱八"},{$addToSet:{"score":{$each:[92,66]}}})
$pop
$pop操作符:删除数组元素。1表示从数组尾部删除,-1从头开始删除。一次只能删除一个元素。删除数组元素$pop 只能删除第一个或最后一个
删除钱八score里面最后一个成绩 db.students.update({"name":"钱八"},{$pop:{"score":1}}) 删除钱八score里面第一个成绩 db.students.update({"name":"钱八"},{$pop:{"score":-1}})
$pull
$pull操作符:从数组中删除满足条件的元素,删除指定的值
成绩里有多个87,都会被同时删除,pull适用于同时删除多个相同元素的场景 db.students.update({"name":"钱八"},{$pull:{"score":87}}) db.students.update({"_id":1001},{$pull:{"score":{$gt:85}}})
删除文档
remove()\deleteOne()\deleteMany()
remove()函数可删除集合中指定的文档。如果使用的条件在集合中可以匹配多条数据,remove()函数会删除所有符合条件的数据,可以指定justOne参数,只删除第一条数据。
语法格式:remove({指定删除条件},删除参数(可选参数)
deleteOne()函数是官方推荐删除文档的方法,只删除满足条件的第一条文档。
deleteMany()函数是官方推荐删除文档的方法,删除满足条件的所有数据。
删除姓名为张三记录的文档 db.students.remove({"name":"张三"}) 删除姓名为李四,性别为女记录的文档 db.students.remove({"name":"李四","sex":"女"}) 删除集合所有记录 db.stuinfo.remove({}) db.stuinfo.deleteMany({}) db.comment.deleteOne({"likenum":null}) db.comment.deleteMany({likenum:{$gt:600}})
remove用于将集合中的文档删除,但不删除集合本身,也不删除集合的索引。
drop不仅删除集合的文档,也会删除集合本身,同时也会删除在集合上创建的索引。drop不能轻易使用!