mongoDB 详解 三、mongoDB 的增删改
来源:互联网 发布:天龙八部mac 编辑:程序博客网 时间:2024/05/22 15:57
在上一节中,我们讲了MongoDB shell的使用,链接为 mongoDB 详解 二、mongoDB shell的使用 ,这一节中,我们将会讲解mongoDB 中增删改,因为查的东西涉及的比较多,我们会放到下一节中进行讲解。
一、增:
1、单个增加:
insert
不指定_id:
db.student.insert({"name":"zhangsan"})
此为给student集合中插入一条name为zhangsan的文档,当插入的文档没有指定_id时,mongoDB会自动为其增加一个唯一的_id
指定_id:
db.student.insert({"_id":"ab323","name":"lisi"})
二、删:
1、删除文档:
使用 remove 来删除集合中的文档
比如
db.student.remove({"name":"zhangsan"})
此为删除student集合中所有name为zhangsan的文档
2、删除集合:
可以使用 drop 直接删除集合,例如:
db.student.drop()
此为将student集合删除。
注意所有删除操作都是不可逆的
三、改:
mongoDB中使用 update 来更新文档,其中接受两个参数,第一个参数即为限定条件,相当于sql中的where,第二个参数默认为要替换的文档,注意默认方式是替换文档,即是将原先的文档除了_id外全部删除,然后替换为要修改的数据,所以使用默认方式可能会丢失数据
1、默认文档替换:
比如,我想将student集合中所有 name 为 lisi 的数据全部替换为 name 为 zhangsan 的数据
原先的数据可能是
{"_id":"ObjectId("571464dbe54266")","name":"lisi","age":18}
使用
db.student.update({"name":"lisi"},{"name":"zhangsan"})
之后,文档变成了
{"_id":"ObjectId("571464dbe54266")","name":"zhangsan"}
即mongoDB将 {"_id":"ObjectId("571464dbe54266")","name":"lisi","age":18} 全部替换成了
{"_id":"ObjectId("571464dbe54266")","name":"zhangsan"}。
注意,替换是可以修改_id的
2、使用修改器:
在数据更新时,我们一般只会更新少量字段,基本不会进行替换,所以可以使用mongoDB的更新修改器。
2.1、增加
使用 $inc 来进行增加
比如有一个文章集合 article ,其中的数据为
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Bob"}
我现在想将id为 ObjectId("5972c811fc51b87d6a71dc25") 的文章的 查看数量(views)加1,注意如果想增加的字段没有的话,那么mongoDB会自动增加这个字段。
db.article.update({"_id":ObjectId("5972c811fc51b87d6a71dc25")}, {"$inc":{"views":1}})
则修改后的数据为
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Bob","views":1}
2.2、局部修改:
与sql类似,可以使用 $set 进行局部修改。
比如,可以将对应 _id 的文档的作者改为 Michael
db.article.update({"_id":ObjectId("5972c811fc51b87d6a71dc25")}, {"$set":{"author":"Michael"}})
则 _id 为 ObjectId("5972c811fc51b87d6a71dc25") 的文档中author改为了Michael,但是其他列没有改变
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Michael", "views" : 1}
注意局部修改默认只改第一个匹配的文档,如果改所有的,可以看下面的批量更新
2.3、删除key:
当文档中有不用的key时,我们可以使用 unset 将key-value删除:
比如添加一个 name 为 haha:
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Michael", "views" : 1, "name" : "haha" }
下面将name列删除:
db.article.update({"_id":ObjectId("5972c811fc51b87d6a71dc25")},{"$unset":{"name":1}})
即又变回原样:
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Michael", "views" : 1 }
2. 4、数组操作:
2.4.1、添加元素
我们可以使用 $push 对数组进行添加操作
使用 $push 对数据添加元素时,如果没有这个key,会自动增加这个key,并插入数组
比如,我想给一个article中的文档添加comments这个数组,里面放置着评论
db.article.update({"_id" : ObjectId("5972c811fc51b87d6a71dc25")}, {"$push":{"comments":"well"}})
此为给_id为ObjectId("5972c811fc51b87d6a71dc25")的文档添加评论为well的comments。
添加完成之后为
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Michael", "views" : 1, "comments" : [ "well" ] }
2.4.2、插入非同种元素:
就像java中的set一样,为了不在数组中插入相同的元素,可以使用 $addToSet 来插入,这样,保证一个数组中不会插入相同的元素。
db.article.update({"_id" : ObjectId("5972c811fc51b87d6a71dc25")}, {"$addToSet":{"comments":"well"}})
可以看到,我在已经有了评论为well的文档中在插入一条数组,结果是还是只有一个well,避免了重复插入
{ "_id" : ObjectId("5972c811fc51b87d6a71dc25"), "title" : "hello mongoDB", "author" : "Michael", "views" : 1, "comments" : [ "well" ] }
2.4.3、数组元素删除:
可以使用 $pop 对数组元素进行头部删除和尾部删除
{"$pop":{"key":-1}} 即为删除头部的元素
{"$pop":{"key":1}} 即为删除尾部的元素
db.article.update({"_id" : ObjectId("5972f079fc51b87d6a71dc26")}, {"$pop":{"comments":-1}})
此为将comments数组中的头部元素删除
db.article.update({"_id" : ObjectId("5972f079fc51b87d6a71dc26")}, {"$pop":{"comments":1}})
此为将comments数组中的尾部元素删除
可以使用 $pull 对指定数组元素进行删除
db.article.update({"_id" : ObjectId("5972f079fc51b87d6a71dc26")}, {"$pull":{"comments":"good"}})
此为将_id为ObjectId("5972f079fc51b87d6a71dc26")的文档中comments中的good元素删除
3、upsert更新
upsert更新比较特殊,它可以显著的减少我们的判断步骤,比如有一个需求,在webVisit集合中,记录着网站中各个访问地址对应的访问次数,当有一个访问地址有人访问时,我们即需要对此地址的访问次数加1,但如果此访问地址在集合中没有呢?那默认肯定是无法更新了,因为找不到,不过,如果使用upsert的话,那么如果找不到,就是直接增加一个新的文档,并执行相关操作。
upsert是update()方法的第三个参数,使用时置为true即可。
upsert是原子操作,可以放心使用
比如:
db.webVisit.update({"path":"/page/first.html"}, {"$inc":{"visitNum":1}}, true)
则集合中即包含相应文档:
{ "_id" : ObjectId("5972fec7810aec1eebe32e4e"), "path" : "/page/first.html", "visitNum" : 1 }
4、批量更新:
因为默认修改只修改第一个匹配的,如果想要全部修改,可以设置update()函数的第4个参数为true。
db.article.update({"title":"mongoDB study"}, {"$set":{"author":"Arthur"}}, false, true)
此将所有满足title为mongoDB study的文档都局部修改为author为Arthur
- mongoDB 详解 三、mongoDB 的增删改
- Mongodb的增删改
- MongoDB入门学习(三):MongoDB的增删查改
- MongoDB简单的增删改
- MongoDB的增删改查
- MongoDB的文档增删改
- mongodb的增删改查
- Mongodb的增删改查
- MongoDB 学习三(数据库的增删改查)
- MongoDB(三)——增删改查
- MongoDB(三)——增删改查
- MongoDB增删改查(三)
- MongoDB学习三--MongoDB简单增删改查
- java连接MongoDB与MongoDB增删改查详解
- MongoDB增删改查
- mongodb增删改查
- MongoDB增删查改
- mongodb 增删改查
- 【2017.8.6普及模拟】最大(max)
- POJ 3260 The Fewest Coins(动态规划+多重背包+完全背包)
- Java类的定义与实例化
- idea环境基于maven整合ssm
- 帅帅哥曾经遇到面试相关
- mongoDB 详解 三、mongoDB 的增删改
- 苹果开发者账号申请(公司账号)
- 英语单词辨异 —— 容易理解错的单词
- 2017 Multi-University Training Contest
- 17.8.6B组总结
- http协议之面试题
- bootstrap-table表格客户端分页实例
- 基于Theano的深度学习框架keras及配合SVM训练模型
- JS基础--函数