您的位置:首页 > 数据库 > Mongodb

[置顶] MongoDB基础部分及实现(一)

2016-09-20 19:20 567 查看
MongoDB基础部分及实现(一)
 

MongoDB是由C++语言所编写的一种面向文档的非关系型数据库(是一种NoSql数据库实现),也是介于关系型数据库和非关系型数据库之间的数据存储产品,其提供了高性能、高可用、高可拓展及基于分布式存储的数据库,是非关系型数据库中功能最丰富,最类似关系型数据库的一种集合、文档格式的数据库。

 

l   优点区别

l   数据模型

l   数据操作

l   语言拓展

 

一、优点区别

A、数据存储格式不同,MongoDB采用文档形式存储数据(JSON),而RDBMS则是数据表格式;

B、采用键-值对形式存储数据,性能高于RDBMS的表检索性能;

C、不存在复杂的数据结构连接操作;

D、易于拓展规模化;

E、不需要RDBMS数据库对象的应用程序转换和映射;

F、对任何属性内容可索引;

G、复制、自动分片及快速更新数据的能力;

 

一般情况,我们会在企业大数据情景或是数据库数据量很大时候,使用MongoDB数据库存储,利用其本身的数据存储优势,来提高数据存储的性能、拓展及高可用。

 

二、数据模型

在这里,我们以帖子、帖子评论及帖子标签为例来说明在RDBMS和MongoDB的区别,目的只为说明后者的方便性,不需要复杂的关联关系。

对于关系型数据库,若实现上面的例子,至少需要三张数据表才可以实现该需求,具体的数据表ER图如下:



 

而使用MongoDB实现就比较简单,只需要将comment和tag_list嵌入post即可,不需要创建多个文档,仅仅一个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
      }
   ]
}

 

三、数据操作

1、数据库操作

A、创建数据库

> use mydb
switched to db mydb
 

B、查询当前数据库

> db
mydb

 

C、查看数据库列表

> show dbs
local    0.000GB
test     0.000GB

 

由于新建的数据库mydb中没有数据,默认是不显示的,所以我们插入一个文件:

> 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": [ ]
})

新建了一个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-10-19T10: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-10-19T10: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-10-19T10: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限定删除第一个文档):

> db.post.remove({},1)
WriteResult({"nRemoved" : 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

 

 

四、语言拓展

语言拓展指的是如何将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();
?>
 

结果如下显示,则说明添加完成:



 

其次,这里演示下对其的增、查操作:

连接并选择数据库:

// 连接到数据库
$m = new MongoClient("test.mongodb.com:27017");
// 选择一数据库
$db = $m->mydb;

选择一个集合:

// 连接到数据库
$m = new MongoClient();
// 选择一数据库
$db = $m->mydb;

插入一个文档,并在命令行模式下查看结果:

// 插入一个文档
$document = array(
    "title" => "MongoDB",
    "desc" => "database",
    "likes" => 100000,
    "url" => "http://www.cwteam.com",
    "by" => "cwteam.com"
);
$collections->insert($document);

结果显示:



 

查询指定集合所有文档,并在浏览器查看结果:

// 查询所有文档
$cursors = $collections->find();
foreach($cursors as $document) {
    echo 'title:'.$document["title"].'</br>';
    echo 'desc:'.$document['desc'].'</br>';
    echo 'likes:'.$document['likes'].'</br>';
    echo 'url:'.$document['url'].'</br>';
    echo 'by:'.$document['by'].'</br>';
}

结果显示:

 

   


 

好了,经过以上的过程,我们已经成功完成在php中使用mongodb的介绍,因为mongodb在php中的使用与命令行模式相同,这里不再介绍。

 

2、在Java的使用

在Java环境中使用Mongodb数据库,我们需要为其classpath添加mongo.jar文件。这里我们同样以PHP的例子为例说明,我们新建一个java项目,并使用mongo.jar提供的api来操作mongo.jar,具体如下:

A、下载软件包

官网地址:

https://docs.mongodb.com/ecosystem/drivers/java/

 

 

B、验证及使用

这里使用的版本为mongo-java-driver-2.10.1.jar,我们只需要将其导入到java项目即可使用,具体如下:

连接并选择一个数据库:

// 连接并选择数据库
               MongoClientmogoClient =
new MongoClient("test.mongodb.com",27017);
               DB mydb =
mogoClient.getDB("mydb");

 

获得一个集合:

// 获取一个集合
               DBCollection collecs =
mydb.getCollection("post");

 

插入一个文档,并在命令行模式下查看结果:

// 插入一个文档
               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(新)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: