Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。
MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB服务端可运行在Linux、Windows或Mac平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。
热身:
show dbs 显示所有的数据库
exit 退出
db 当前数据库
show tables / show collections 当前数据库有多少张表(集合)
db.c1.insert({name:"user1"}); 插入一条数据
db.c1.save({name:"user1"}); 插入一条数据
两者区别:
如果要插入的_id相同,save可以操作,_id相同则更改,不同则插入。
但是insert会报错:
db.c1.find(); 查询c1表中所有数据
db.c1.find("条件"); 查询符合该条件的所有记录
db.c1.findOne(); 只查询第一条记录
db.c1.findOne("条件"); 只查询符合该条件的第一条记录
进入data目录下查看:
db.c1.remove(); 删除c1集合中所有的数据
db.c1.remove("条件"); 删除c1集合中符合条件的所有的数据
修改数据把user3修改成user30:
若已经插入db.c1.insert({name:"user3",age:30});
{ "_id" : ObjectId("54cc83821e766bd0fad100e2"), "name" : "user3", "age" : 30 }
db.c1.update({name:"user3"},{name:"user30"});
但是修改后的记录是:
{ "_id" : ObjectId("54cc83821e766bd0fad100e2"), "name" : "user30" }
少掉了age:30
若不丢失其他json数据,则这样进行修改即可:
db.c1.update({name:"user3"},{$set:{name:"user300"}}); //和删除一样,第一个参数里面是条件匹配
若要增加json数据,则这样进行修改即可:
db.c1.update({name:"user300"},{$set:{sex:"boy"}});
{ "_id" : ObjectId("54cc83821e766bd0fad100e2"), "age" : 30, "name" : "user300", "sex" : "boy" }
子json插入:
db.c1.insert({name:"user1",post:{title:1,content:"hello"}});
子数组插入:
db.c1.insert({name:"user2",post:[1,2,3,4,5]});
{ "_id" : ObjectId("54cc8efabe9bf76a3494b725"), "name" : "user1", "post" : { "title" : 1, "content" : "hello" } }
{ "_id" : ObjectId("54cc8f98be9bf76a3494b726"), "name" : "user2", "post" : [ 1, 2, 3, 4, 5 ] }
写个循环语句进行插入:
如果只要查询某一条记录的某一列,需要设置find的第二个参数即可,如设置name:1,表示只显示name这一列:
db.c1.find({name:"user11"});
{ "_id" : ObjectId("54cc937428be09ca6a8023ba"), "name" : "user11", "age" : 20, "sex" : "boy" }
db.c1.find({name:"user11"},{name:1});
{ "_id" : ObjectId("54cc937428be09ca6a8023ba"), "name" : "user11" }
db.c1.find({name:"user11"},{name:1,age:1});
{ "_id" : ObjectId("54cc937428be09ca6a8023ba"), "name" : "user11", "age" : 20 }
如果不想带上_id, _id:0.
db.c1.find({name:"user11"},{name:1,age:1,_id:0});
{ "name" : "user11", "age" : 20 }
一、高级查询
1)条件>,>=,<,<=,=
db.c1.find({age:{$gt:5}}); //查询年龄大于5的
db.c1.find({age:{$lt:5}}); //查询年龄小于5的
db.c1.find({age:{$gte:5}});//查询年龄大于等于5的
db.c1.find({age:{$lte:5}});//查询年龄小于等于5的
db.c1.find({age:{$ne:5}});//查询年龄不等于5的
db.c1.find({age:{$gt:5}}).limit(3); //查询年龄大于5的,前3个记录。
db.c1.count(); db.c1.find().count(); //查询表c1有多少条记录
db.c1.find().sort({age:1}); //升序
db.c1.find().sort({age:-1}); //降序
db.c1.find().skip(5).limit(5); //跳过5个,查询5个
db.c1.find().skip(1).limit(5); //跳过1个,查询5个
db.c1.find().skip(7).limit(2).sort({age:-1}); //跳过1个,查询5个(这里是排序后再跳过多少条数据执行)
db.c1.find().skip(7).limit(2).sort({age:-1}).count(0);
结果是:10
db.c1.find().skip(7).limit(2).sort({age:-1}).count(1);
结果是:2
2)
$all操作类似$in操作,但是不同的是,$all操作要求数组里面的值全部被包含在返回的记录里面。
3)
$exists操作检查一个字段是否存在,如:
4)
$mod操作可以让我们简单的进行取模操作,而不需要用到where子句。
5)
$in操作类似于传统关系数据库中的in
6)
$nin跟in操作相反
7)
$nor跟$or相反(可以有多个字段参与)
8)
$or(可以有多个字段参与)
9)
$size操作将会查询数组长度等于输入输入参数的数组
10)正则表达式
11)distinct
12)$elemMatch
13)Cursors游标及Cursors Methods
遍历游标
14)null
解决方式1:
exists:(过滤未定义的age)
exists+in:(过滤未定义的age并且为null的age)
解决方式2:
15)slice
查询第一篇帖子,前两篇帖子,前三篇帖子
查询倒数第一篇帖子,倒数后两篇帖子
查询skip:1,limit:2
二、高就修改
1)语法
db.collection.update(criteria,objNew,upsert,multi) //后两个参数默认为:0,0
参数说明:
criteria:用于设置查询条件的对象
objNew:用于设置更新内容的对象
upsert:如果记录已经存在:更新它,否则新增一个记录
multi:如果有多个符合条件的记录,全部更新
注意:默认情况下,只会更新第一个符合条件的记录
必须是$set才可以
2)save()
// 如果存在更新它,如果不存在,新增记录
3)$set
语法:
{$set:{field:value}}
功能: 把field的值设置成value,当field不存在时,增加一个字段,value支持所有类型。
4)常用操作:
$inc
语法:{$inc:{field:value}}
功能:把field的值加一个value
也可以减去一个数:
$unset
语法:{$unset:{field:1}}
功能:
删除给定的字段field。
$push
语法:{$push:{field:value}}
功能:
如果field是一个已经存在的数组,那么把value追加给field;
如果原来不存在,那么新增field字段,把value的值赋给field;
如果field存在,但不是一个数组,将会报错。
push子数组:
$pop
语法:{$pop:{field:1}}
功能:删除数组中的最后一个元素
语法:{$pop:{field:-1}}
功能:删除数组中的第一个元素
$pushAll
语法:{$pushAll:{field:value}}
功能:同push,只是这里的value是数组,相当于对数组里的每一个值进行push操作。
5)
$addToSet
语法:{$addToSet:{field:value}}
功能:如果field是一个已经存在的数组,并且value不在其中,那么把value加入到数组;
如果field不存在,那么把value当成一个数组形式赋给field;
如果field是一个已经存在的非数组类型,那么将会报错。
$addToSet配合$each使用
$pull
语法:{$pull:{field:_value}}
功能:
如果field是一个数组,那么删除符合_value检索条件的记录;
如果field是一个已经存在的非数组,那么会报错。
$pullAll
语法:{$pullAll:{field:value_array}}
功能:同push类似,只是value的数据类型是一个数组。
$rename
语法:{$rename:{old_field_name:new_field_name}}
功能:重命名指定的字段名称,从1.7.2版本后开始支持
6)
特殊操作符:$
$操作符代表查询记录中第一个匹配条件的记录项
7)
find得到的x是一个有游标的
findOne得到的x相对于一个json对象
通过x(findOne)增加一些属性,接着用save(x)保存: