MongoDB基础部份及实现(1)
MongoDB是由C++语言所编写的1种面向文档的非关系型数据库(是1种NoSql数据库实现),也是介于关系型数据库和非关系型数据库之间的数据存储产品,其提供了高性能、高可用、高可拓展及基于散布式存储的数据库,是非关系型数据库中功能最丰富,最类似关系型数据库的1种集合、文档格式的数据库。
l 优点区分
l 数据模型
l 数据操作
l 语言拓展
1、优点区分
A、数据存储格式不同,MongoDB采取文档情势存储数据(JSON),而RDBMS则是数据表格式;
B、采取键-值对情势存储数据,性能高于RDBMS的表检索性能;
C、不存在复杂的数据结构连接操作;
D、易于拓展范围化;
E、不需要RDBMS数据库对象的利用程序转换和映照;
F、对任何属性内容可索引;
G、复制、自动分片及快速更新数据的能力;
1般情况,我们会在企业大数据情形或是数据库数据量很大时候,使用MongoDB数据库存储,利用其本身的数据存储优势,来提高数据存储的性能、拓展及高可用。
2、数据模型
在这里,我们以帖子、帖子评论及帖子标签为例来讲明在RDBMS和MongoDB的区分,目的只为说明后者的方便性,不需要复杂的关联关系。
对关系型数据库,若实现上面的例子,最少需要3张数据表才可以实现该需求,具体的数据表ER图以下:
而使用MongoDB实现就比较简单,只需要将comment和tag_list嵌入post便可,不需要创建多个文档,仅仅1个post文档便可描写清楚,具体以下键值对格式数据:
{
_id: POST_ID
title: TITLE_OF_POST,
desc: POST_DESCRIPTION,
by: POST_BY,
url: URL_OF_POST,
tags:[TAG1, TAG2, TAG3],
likes: TOTAL_LIKES,
comments:[
{
user:'COMMENT_BY',
content: TEXT,
time: DATE_TIME,
like: LIKES
},
{
user:'COMMENT_BY',
content: TEXT,
time: DATE_TIME,
like: LIKES
}
]
}
3、数据操作
1、数据库操作
A、创建数据库
> use mydb
switched to db mydb
B、查询当前数据库
> db
mydb
C、查看数据库列表
> show dbs
local 0.000GB
test 0.000GB
由于新建的数据库mydb中没有数据,默许是不显示的,所以我们插入1个文件:
> db.movie.insert({"name":"cloud waterteam using!"})
WriteResult({"nInserted" : 1 })
再次使用show dbs,便可看到新建数据库:
> show dbs
local 0.000GB
mydb 0.000GB
test 0.000GB
D、删除数据库
> db.dropDatabase()
{ "dropped" :"mydb", "ok" : 1 }
查看以下表,看是不是删除:
> show dbs
local 0.000GB
test 0.000GB
2、CURD操作
在MongoDB中,数据的CURD操作是针对集合而言,也就是文档的增、删、改及查询操作是在所属集合中进行,具体以下:
A、新建集合
> db.createCollection("mycollection")
{ "ok" : 1 }
新建以后,查询下是不是创建完成:
> show collections
mycollection
注意:
在MongoDB中,可以不显示的创建集合,由于系统会自动创建集合,比如:当我们使用db.COLLECTION_NAME.insert({…})时会自动新建或是打开存在的集合,另外,我们也能够在创建集合的同时插入文档到改集合,格式语法以下:
db.cteateCollection(“COLLECTION_NAME”,{…})
B、删除集合
> db.mycollection.drop()
true
查询是不是删除集合成功:
> show collections
C、插入文档
> db.post.insert([{title:'MongoDB 000',desc:'MongoDBis one of nosqldatabase',by:'cwteam',url:'www.baidu.com',tags:['mongodb','nosql','database'],likes:10000},{title:'MongoDB001',desc:'Nosql db has no tables,younknow?',by:'cwteam',url:'www.baidu.com',tags:['mongodb','nosql','database'],likes:20000,comments:[{user:'cwteam',content:'thefirst comment',time:new Date(2016,09,19,18,10),like:0}]}])
BulkWriteResult({
"writeErrors": [ ],
"writeConcernErrors": [ ],
"nInserted": 2,
"nUpserted": 0,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": [ ]
})
新建了1个post集合,并插入两条记录(评论及标签)。
D、查询文档
非格式化查询:
> db.post.find()
{ "_id" :ObjectId("57dfb9a633c51cdbe23b798a"), "title" :"MongoDB 000", "desc" : "MongoDB is one of nosql database", "by" :"cwteam", "url" : "www.baidu.com","tags" : [ "mongodb", "nosql", "database"], "likes" : 10000 }
{ "_id" :ObjectId("57dfb9a633c51cdbe23b798b"), "title" :"MongoDB 001", "desc" : "Nosql db has no tables,younknow?", "by" : "cwteam", "url" :"www.baidu.com", "tags" : [ "mongodb","nosql", "database" ], "likes" : 20000, "comments": [ { "user" : "cwteam", "content" : "thefirst comment", "time" :ISODate("2016⑴0⑴9T10:10:00Z"), "like" : 0 } ] }
格式化查询:
> db.post.find().pretty()
{
"_id": ObjectId("57dfb9a633c51cdbe23b798a"),
"title": "MongoDB 000",
"desc": "MongoDB is one of nosqldatabase",
"by": "cwteam",
"url": "www.baidu.com",
"tags": [
"mongodb",
"nosql",
"database"
],
"likes": 10000
}
{
"_id": ObjectId("57dfb9a633c51cdbe23b798b"),
"title": "MongoDB 001",
"desc": "Nosql db has no tables,youn know?",
"by": "cwteam",
"url": "www.baidu.com",
"tags": [
"mongodb",
"nosql",
"database"
],
"likes": 20000,
"comments": [
{
"user": "cwteam",
"content": "the first comment",
"time": ISODate("2016⑴0⑴9T10:10:00Z"),
"like": 0
}
]
}
E、修改文档
更新现有文档:
>db.post.update({'_id':ObjectId("57dfb9a633c51cdbe23b798b")},{$set:{'url':'www.cwteam.com'}})
查看下更新的结果:
{
"_id": ObjectId("57dfb9a633c51cdbe23b798b"),
"title": "MongoDB 001",
"desc": "Nosql db has no tables,youn know?",
"by": "cwteam",
"url": "www.cwteam.com",
"tags": [
"mongodb",
"nosql",
"database"
],
"likes": 20000,
"comments": [
{
"user": "cwteam",
"content": "the first comment",
"time": ISODate("2016⑴0⑴9T10:10:00Z"),
"like": 0
}
]
}
注意:
如果要修改多个文档,可以这样操作:
>db.post.update({'_id':ObjectId("57dfb9a633c51cdbe23b798b")},{$set:{'url':'www.cwteam.com'},{multi:true})
替换现有文档:
>db.post.save({'_id':ObjectId("57dfb9a633c51cdbe23b798a"),'title':'hellowmongodb','by':'cwteam'})
WriteResult({"nMatched" : 1, "nUpserted" : 0, "nModified" : 1})
查看下替换的结果:
{
"_id": ObjectId("57dfb9a633c51cdbe23b798a"),
"title": "hellow mongodb",
"by": "cwteam"
}
F、删除文档
删除1个文档(1限定删除第1个文档):
> db.post.remove({},1)
WriteResult({"nRemoved" : 1 })
如果要随便删除任何1个文档,只需要下面操作:
> db.post.remove({"_id":ObjectId("57dfb9a633c51cdbe23b798a")})
删除所有文档:
> db.post.remove({})
WriteResult({ "nRemoved" : 1 })
3、备份还原
备份操作:
sudo ./mongodump -h 127.0.0.1:27017 -d mydb -o../data/backup
还原操作:
sudo ./mongorestore -h127.0.0.1:27017 -d mydb -dir ../data/backup/mydb
4、语言拓展
语言拓展指的是如何将MongoDB与开发语言结合,实现彼此的顺利通讯交互,实际上就是调用相干的对外api来访问和操作MongoDB,下面就以在PHP和Java中如何使用其进行说明。
1、在PHP的使用
在PHP中使用MongoDB数据库,我们必须为其添加MongoDB驱动拓展,并在php.ini文件中将该拓展嵌入到PHP环境中,以下所示:
extension=php_mongo.so/.dll(后缀类型根据系统环境而不同,linux/unix/mac 为.so,而windows则为.dll)。
A、下载及安装
这里我们通过pecl软件集工具在线安装mongo驱动,具体以下:
$sudo pecl install mongo
B、拓展及配置
我们将上面安装以后生成的mongo.so文件路径添加到php.ini中,以下:
extension=mongo.so
注意:
更新php.ini配置文件后,必须重启web服务才能生效修改的配置信息。
C、验证及使用
首先,我们验证下mongodb驱动是不是添加完成:
<?php
phpinfo();
?>
结果以下显示,则说明添加完成:
其次,这里演示下对其的增、查操作:
连接并选择数据库:
选择1个集合:
插入1个文档,并在命令行模式下查看结果:
结果显示:
查询指定集合所有文档,并在阅读器查看结果:
结果显示:
好了,经过以上的进程,我们已成功完成在php中使用mongodb的介绍,由于mongodb在php中的使用与命令行模式相同,这里不再介绍。
2、在Java的使用
在Java环境中使用Mongodb数据库,我们需要为其classpath添加mongo.jar文件。这里我们一样以PHP的例子为例说明,我们新建1个java项目,并使用mongo.jar提供的api来操作mongo.jar,具体以下:
A、下载软件包
官网地址:
https://docs.mongodb.com/ecosystem/drivers/java/
B、验证及使用
这里使用的版本为mongo-java-driver⑵.10.1.jar,我们只需要将其导入到java项目便可使用,具体以下:
连接并选择1个数据库:
// 连接并选择数据库
MongoClientmogoClient = new MongoClient("test.mongodb.com",27017);
DB mydb = mogoClient.getDB("mydb");
取得1个集合:
// 获得1个集合
DBCollection collecs = mydb.getCollection("post");
插入1个文档,并在命令行模式下查看结果:
// 插入1个文档
BasicDBObjectdoc = new BasicDBObject();
doc.append("title", "MongoDB-Java");
doc.append("desc", "database");
doc.append("likes", 300000);
doc.append("url", "test.mongodb.com");
doc.append("by", "cwteam.com");
collecs.insert(doc);
结果显示:
查询所有文档,并在输出查看日志打印结果:
// 查找所有文档
DBCursordbCursor = collecs.find();
List<DBObject>objs = dbCursor.toArray();
for(DBObject dobj : objs) {
log(dobj.toString());
}
结果显示:
好了,Mongodb基础部份就介绍到这里,由于作者水平有限,如有问题请在评论发言讨论,谢谢。
技术讨论群:
276592700(新)
上一篇 程序员易混淆的10个基础概念
下一篇 AWT菜单: