主要是对比MySQL来说明

优点

  不存在sql注入:MySQL的是sql注入是一个很严重的缺点,虽然可以使用参数绑定和预处理以及特殊字符转义来处理。但是MongoDB根本不存在这个问题。不过xss攻击还是需要防范的。

  不需要提前创建表:在MySQL中如果想要写入一条数据的话必须要先创建好一张表然后才能写入数据,比如:要在user表里写入id=1,username=‘aaa’,sex='女',age=‘20’这条数据,那你就必须在MySQL数据库上提前建好一张user表,并且至少必须有id,username,sex,age这几个字段才能写入成功。但是MongoDB可以直接写入数据,不需要提前创建表,例子:db.user.insert({"id":1,"username":"aaa","sex":"女","age":20}) 就好

  可以任意添加或减少字段:用上一个例子,在MySQL中假设我要在上一条数据上再加一个身高height字段,那么我就必须再去user表上再去添加一个height字段才能写入height数据。但是在MongoDB中你可以直接写就行,而且假设你的第一条数据是 id,username,sex,age,那么你的第二条数据大可以写成 id,username,age,leight。

  字段数据格式自由:在MySQL中,如果id字段是数字的话你写一个字符串进去是会报错的,但是MongoDB不会。

  可以处理json结构:在MongoDB可以存储一个json对象,比如 字段a的值为{"a":11,"b":12,"c":"abc","d":[1,2,3]},你可以直接去读取或设置a字段的b值 a.b,读取a字段d数组的第二个值:a.d.1,可以去删除a字段的a数据$unset:{"a.a":1},就会变成:{"b":12,"c":"abc","d":[1,2,3]}

  可以使用upsert操作,即修改的数据不存在时直接插入。({where},{$set:{data}},{"upsert":true})

  充分利用了计算机内存,所以查询和插入效率要远大于MySQL。我自己测试(400w随机数据)的时候只有在没有索引的情况下MongoDB的查询效率要远大于MySQL,插入效率和MySQL差不多都是8w条左右1分钟。在有索引的时候MySQL的查询要速度要高于MongoDB。

缺点

  MongoDB是个nosql数据,所以关系能力薄弱,不能像MySQL一样使用join,union来进行联合查找,只能通过结合一些特殊语法来达到类似的结果。

  事务能力薄弱,虽然MongoDB里事务,但是好像只能针对单条语句(查了好多但是有些看不懂),不能像MySQL一样利用事务执行多条语句,可以根据情况来选着全部提交执行或者全部取消回滚。

  相比MySQL,MongoDB的效率存在一定的波动性,不是很稳定。

  由于数据存储的问确定性2,3,4条,MongoDB的管理相对MySQL会困难一些

  MongoDB的管人员(DBA)比较少

总结: 

  如果会频繁使用事务和关联查询,并且最求服务的稳定性最好还是选用MySQL

  如果数据格式不确定,却少数据库管理人员,不怎么使用关联查询和事务,不是特别追求服务的稳定性可以使用MongoDB

  不是很重要的数据可以使用MongoDB,比较重要的使用可以用使用MySQL。