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

 

原创粉丝点击