在上一节中,我们讲了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