一,关于数据库的基本了解:
数据库分为两种:
(1).关系型数据库;
(2).非关系型数据库。
mongodb 是非关系型数据所以主要说说非关系型数据库:
nosql,区别于应用于RDBMS(关系型数据库)的SQL(结构化查询语言)。SQL主要用于结构化存储的数据的查询与分析操作。而nosql支持类似sql的功能,但是与之相比没有那么多约束,显得更灵活。
二,nosql通常泛指非关系型数据库,通常分为以下四大类:
(1).键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo
Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
(2).列存储数据库。
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra,
HBase, Riak.
(3).文档型数据库
文档型数据库的灵感是来自于Lotus
Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可
以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb.
国内也有文档型数据库SequoiaDB,已经开源。
(4)图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J,
InfoGrid, Infinite Graph.
因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。
三,mongodb基本概念
(1).mongodb是属于文档型的非关系型数据库,是开源、高性能、高可用、可扩展的。
四,基本的命令操作:
1.显示所有数据库:
show dbs//显示所有数据库(默认有3个:admin、local、test)admin和local会显示出来,test没有数据所以不显示。
2.打开/创建数据库:
use 数据库名
//例如:use school
注意:自动创建一个school数据库,但显示时不会出现,因为它里面没有集合和文档。如数据库存在则打开,不存在则创建。
3.显示当前数据库
db
4.删除数据库:
db.dropDatabase()
5.查看集合
show collections
- 创建集合
db.createCollection(name,[options])
//options,可选项,指定有关内存大小和索引的选项
例1:
db.createCollection(“tb_user”)
db.createCollection(“tb_user”, {capped : true, autoIndexId : true, size :6142800, max : 10000 })
capped:true ---如果为true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大大小时自动覆盖其最旧的条目。如果指定true,则还需要指定size参数。
autoIndexId:true ---如果为true,则在_id字段上自动创建索引。默认值为false
size:6142800 ---指定上限集合的最大大小(以字节为单位)。 如果capped为true,那么还需要指定此字段的值。
max:10000 ---指定上限集合中允许的最大文档数。
- 删除集合
db.集合名.drop()
//例:db.tb_user.drop()
- 添加
db.集合名.save({数据},……)
或
db.集合名.insert({数据},……)
例1:添加一条文档
db.tb_user.insert({ _id : 1, name: "李小龙", age: 20 })
说明:_id为默认主键,不写也会自动添加。
例2:添加多条文档
db.tb_user.insert([{
_id : 2,
name :"李大龙",
age :18
}, {
_id : 3,
name :"李分赴",
age :16
}]);
9.删除
db.集合名.remove({删除条件})
例1:删除学号为1的文档
db.tb_user.remove({_id :1})
例2:删除性别为男且长沙市的
db.tb_user.remove({ $and : [{sex :"男"},{address :"长沙市"}] })
例3:删除年龄等于19岁
db.tb_user.remove({"age":19})
例4:删除年龄大18 小于20的
SQL:delete tb_user whereage>18 and age<20
db.tb_user.remove({
$and:[{ "age" : {$gt:18} }, {"age" : {$lt:20}}]
})
- 修改
db.集合名.update({条件},{$set:{新数据}})
例1:修改ID为3的人的姓名
db.tb_user.update( {"_id":3},{$set:{"name":"金大大"}} )
例2:修改年龄在40岁以下的,姓名改成张三
db.tb_user.update({"age":{$lte:40}}, {$set:{"name":"张三"}}, {multi:true})
注意:{multi:true}用于修改多个时
例3:将ID为3的人年龄+10
db.tb_user.update({"_id":3}, {$set: {$inc:{"age":10}} })
- 查询
db.集合名.find()
例1:查看集合中文档
db.tb_user.find()
db.tb_user.find().pretty() //格式化数据,多条数据看效果(不一定有效果)
例2:重复数据
db.tb_user.distinct("name")
例3:查询指定的列
select name,age from 表名
db.tb_user.find({}, {name: 1, age: 1})
db.tb_user.find({}, {name: 0})
注意:当然name也可以用true或false,当用ture的情况下name:1效果一样,如果用false就是排除name,显示name以外的列信息。
例4:查询前5条数据
db.tb_user.find().limit(5)
例5:查询10条以后的数据
db.tb_user.find().skip(10)
例6:查询在5-10之间的数据
db.tb_user.find().limit(10).skip(5)