MongoDB文档操作

发布于:2025-04-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

插入文档

插入单个文档

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不能轻易使用!


网站公告

今日签到

点亮在社区的每一天
去签到