NoSQL数据库
NoSQL数据库姑且这么理解是为了解决传统关系型数据库在高并发、大数据场景中的劣势而诞生的一种数据库。NoSQL是一类数据库的统称包括,根据数据模型对其进行分类如下。
从图中可以看到MongoDB的数据模型为文档型。
基本使用
库操作
一个mongodb中可以建立多个数据库。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中,
“show dbs” 命令可以显示所有数据的列表。
>show dbs
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
查看当前数据库
>db
选择数据库
>use local
创建集合
执行插入操作会自动创建集合
db.sunyang.insert({"age":"27"})
show tables
使用命令创建
db.createCollection("sunyang2")
db.createCollection(name, options)
其中options包括
options | 功能 |
---|---|
capped | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 |
autoIndexId | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。 |
max | (可选)指定固定集合中包含文档的最大数量。 |
删除集合
db.collection.drop()
插入集合
db.COLLECTION_NAME.insert(document)
db.col.save(document)
批量插入
var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
document在mongodb是oracle中一行记录的意思,在这里是BSON串。
BSON和JSON区别
(1)更快的遍历速度
对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。
(2)操作更简易
对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。
(3)增加了额外的数据类型
JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。
但是,在有的时候,BSON相对JSON来说也并没有空间上的优势,比如对{“field”:7},在JSON的存储上7只使用了一个字节,而如果用BSON,那就是至少4个字节(32位)
目前在10gen的努力下,BSON已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着MongoDB进一步地发展。
一个BSON例子:
{
title:"MongoDB",
last_editor:"192.168.1.122",
last_modified:new Date("27/06/2011"),
body:"MongoDB introduction",
categories:["Database","NoSQL","BSON"],
revieved:false
}
文档更新
语法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
例如
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
多行更新
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
文档替换
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
实例:
>db.col.save({
"_id" : ObjectId("38f54h39f5n723fv4"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "test",
"url" : "test",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
更多实例
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
文档删除
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
db.col.remove({})
remove() 方法 并不会真正释放空间。
需要继续执行 db.repairDatabase() 来回收磁盘空间。
> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })
文档查询
db.collection.find(query, projection)
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
易读可以使用 pretty() 方法,好像在linux中也有这个语法。
db.col.find().pretty()
And
db.sunyang.find({key1:value1, key2:value2}).pretty()
相当于key1和key2是and连接查询
Or
>db.sunyang.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
AND 和 OR 联合使用
db.sunyang.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
条件查询
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
db.sunyang.find({score: {$gt : 100}})
类似于
Select * from sunyang where score > 100;
其他
db.sunyang.find({score: {$gte : 100}})
db.sunyang.find({score: {$lt : 150}})
db.sunyang.find({score: {$lte : 150}})
db.sunyang.find({score: {$lt :200, $gt : 100}})
类似于
Select * from sunyangwhere score>100 AND score<200;
模糊查询
查询 title 包含"教"字的文档:
db.col.find({title:/教/})
查询 title 字段以"教"字开头的文档:
db.col.find({title:/^教/})
查询 titl e字段以"教"字结尾的文档:
db.col.find({title:/教$/})
$type
含义:获取 “sunyang” 集合中 title 为 String 的数据
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
分页
读取指定数量
db.COLLECTION_NAME.find().limit(NUMBER)
分页读
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
实例:
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
实例
db.sunyang.find({},{"title":1,_id:0}).sort({"scores":-1})