今天主要写有关更新操作的东西,前面第二篇已经有简单提过更新,今天主要讲更新,
补充: MongoDB默认监听端口是27170,但是MongoDB在启动服务的时候还会启动一个HTTP服务器,监听端口是28017,你可以通过”http://localhost:28017“ 来访问获取数据库管理信息,
当你用shell连接到某个数据库的时候,MongoDB服务器会自动将这个数据库连接赋值给全局变量db,这个变量是通过shell访问mongodb的主要入口,你可以通过直接运行db查看所指向的数据库,如下图:
下面开始说明修改: 1.save() 前面有提到添加数据的方法save()和insert()两个方法,其实save()也有修改的作用,当使用save的时候如果存在就修改,如下图:
2.$set $set用来指定一个键的值,如果这个键不存在的时候会自动创建,如下图给ruby添加时间:
当然,如果觉得时间不对,可以再次修改,如图:
或许你会觉得date类型不好,那我们可以把它换成字符串类型,如图:
而且$set也可以修改内嵌文档这里就不演示了,如果你突然发现这个键不想要了怎么办呢,那就可以用$unset来删除,如图:
3.$inc $inc可以用来增加或减少已有键的值,不存在时会自动创建一个键 假如我们给ruby这本书添加一个访问量,如下图:
{"$inc":{"num":1}}这里的1表示每次增加1,如果是10就每次增加10 现在我们让这本书每次访问一次我们累加50(不太公平),如图
如果我们给负值它就会减少,如图: $inc的只能用于整数、长整数、双精度浮点数,如果用在其他类型上面会操作失败,
4.$push $push主要用于对数组的操作,不能用在整数、字符串上面, 如果指定的键存在,那么$push会向已有的数组末尾中加入一个元素,要是没有就自动创建一个新的数组,如下图给Ruby这本书添加评论: db.book.article.update({"title":"Ruby"}, {"$push":{"comments":{"name":"Jim", "content":"Good Book!"}}});
接着在给一条评论:
如果给数组添加值,我们可以使用$ne,如图:
有时候可以使用另外一个$addToSet,比如我们给这个用户添加邮箱:
5.$pop $pop删除数组中的数据,你可以把数组看做队列或栈,可以从任何一端删除,1表示从尾部删除,-1表示从头部删除,如图:
6.$pull $pull可以基于特定条件来删除元素,$pull就可以做到,如下图:
7.upsert upsert是一种特殊的更新,要是没有文档符合更新条件,就会依这个条件和更新文档为基础创建一个新的文档,如果找到了匹配的文档就正常更新,非常方便,可是怎么使用呢?前面有提过累加访问量的: db.book.article.update({"title","Ruby"}, {"$inc":{"num":1}}); 如果要使用upsert,只需要多添加一个参数而已: db.book.article.update({"title","Ruby"}, {"$inc":{"num":1}}, true); 或许你会认为只是多个参数而已嘛,但是它这样会更高效,至于为什么高效这里就不说明了,
8.多文档更新 多文档更新是不是要用其他方法啊,不是,只要在update的第4个参数设置为true就可以了, db.book.article.update({"title","Ruby"}, {"$inc":{"num":1}}, true, true); 默认是true,所以一般我们在使用的时候推荐显示表明是否需要,
到这里修改文档的大多数方法都写出来了,这些都要经常练习使用才能熟练,熟练了才能做到自己满足自己实际的需求,虽然Mongodb功能强大,尽量保持关系型数据库的众多特性,但是他并不是要具备所有的关系型数据库的功能,他尽可能地将服务端处理逻辑交给客户端(应用程序处理)),所以有时候特别复杂的功能可能他做不到,不过他这样精简的设计使得MongoDB获得了非常好的性能。
上面的演示例子中我的集合都是book.article、book.author,这种方式叫子集合, 子集合:组织集合的一种惯例是使用"."字符分开的按命名空间划分的子集合, 这样做的目的是为了使组织结构更明确,实际上book是不存在的(不需要存在),推荐使用子集合。 如果有写的不对的地方还请指出批评。