热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安装配置MongoDB数据库

MongoDB是一个高性能,开源,无模式的文档型数据库,采用C++开发,是当前NoSQL数据库中比较热门的一种,在许多场景下可用于替代传统的关系型数据库或键/值存储方式MongoDB使用BSON作为数据存储和传输的格式,BSON是一种类似JSON的二进制序列化文档,支持嵌
MongoDB 是一个高性能,开源,无模式的文档型数据库,采用C++开发,是当前NoSQL数据库中比较热门的一种,在许多场景下可用于替代传统的关系型数据库或键/值存储方式
MongoDB使用BSON作为数据存储和传输的格式,BSON是一种类似JSON的二进制序列化文档,支持嵌套对象和数组。MongoDB很像MySQL,document对应MySQL的row,collection对应MySQL的table
MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB

1,特点和功能

1) 特点
高性能、易部署、易使用,存储数据非常方便。
面向集合存储,易存储对象类型的数据,模式自由。
支持动态查询,支持完全索引,包含内部对象。
支持复制和故障恢复。
使用高效的二进制数据存储,包括大型对象(如视频等)。
自动处理碎片,以支持云计算层次的扩展性
支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
文件存储格式为BSON(一种JSON的扩展),可通过网络访问。
2) 功能

面向集合的存储:适合存储对象及JSON形式的数据。
动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

2,  适用场合

网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源 过载。
大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

3, 下载安装
mongoDB 下载, 最新版本 mongodb-linux-x86_64-2.2.3.tgz
mongoDB 安装:
tar zxvf mongodb-linux-x86_64-2.2.3.tgz
cd mongodb-linux-x86_64-2.2.3
sudo mkdir /opt/mongodb-2.2.3

sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/
安装完毕后,在浏览器URL栏输入: http://localhost:27017/


4, 启动关闭
1) 默认启动
sudo ./bin/mongod    (默认保存文件目录为/data/db/, 没有则新建 sudo mkdir -p /data/db/, 默认端口为27017)

2)指定目录启动
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/       (保存文件目录为/opt/mongodb-2.2.3/ , 没有则新建)

3) 指定端口启动
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/ -p 27000        (端口修改为指定27000),启动输出如下:

MongoDB starting : pid=4222 port=27000 dbpath=/opt/mongodb-2.2.3/ 32-bit host=ubuntu

4) 后台启动命令
sudo ./bin/mongod -shardsvr -replSet shard1 -port=27017 -dbpath=/opt/mongodb-2.2.3/ -logpath=/opt/mongodb-2.2.3/log -logappend -rest -fork

5) 后台关闭命令
$ .bin/mongod                       // 登录客户端
> use admin                          // 切换到管理员
> db.shutdownServer()         // 关闭mongodb
或者
> db.adminCommand({shutdown : 1, force : true})
> //or
> db.shutdownServer({force : true})
> db.adminCommand(shutdown : 1, force : true, timeoutsec : 5)        // 超时关闭
> //or
> db.shutdownServer({force : true, timeoutsec : 5})

6) 客户端启动
默认启动: ./bin/mongo
指定端口启动: ./bin/mongo --port 27000
7) 备份与恢复
$ sudo ./bin/mongodump -d foo -o /opt/mongodb-2.2.3/bk/                  // 备份到bk目录
connected to: 127.0.0.1
Tue Feb  5 20:58:13 DATABASE: foo        to     /opt/mongodb-2.2.3/bk/foo
Tue Feb  5 20:58:13     foo.foo_test to /opt/mongodb-2.2.3/bk/foo/foo_test.bson
Tue Feb  5 20:58:13              1 objects
Tue Feb  5 20:58:13     Metadata for foo.foo_test to /opt/mongodb-2.2.3/bk/foo/foo_test.metadata.json
$ ./bin/mongorestore -d foo -c foo_test /opt/mongodb-2.2.3/bk/foo/foo_test.bson          // 恢复foo_test集合
connected to: 127.0.0.1
Tue Feb  5 20:58:20 /opt/mongodb-2.2.3/bk/foo/foo_test.bson
Tue Feb  5 20:58:20     going into namespace [foo.foo_test]
Tue Feb  5 20:58:20 warning: Restoring to foo.foo_test without dropping. Restored data will be inserted without raising errors; check your server log
Tue Feb  5 20:58:20 WARNING: collection foo.foo_test exists with different options than are in the metadata.json file and not using --drop. Options in the metadata file will be ignored.
1 objects found
Tue Feb  5 20:58:20     Creating index: { key: { _id: 1 }, ns: "foo.foo_test", name: "_id_" }

5, 命令示例
1) 启动服务端
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/

2) 启动客户端
./bin/mongo

3) 客户端简单命令
帮助: help
显示数据库: show dbs;
选择数据库: use test;
插入数据: db.foo.save({homer:2}); 
查询: db.foo.find();
结果: { "_id" : ObjectId("511078ad857b699e9eaaf516"), "homer" : 2 }
更新: db.foo.update({"homer":2},{"homer":3});         // ( {}, {} ) 第一个{}是查询条件,第二个{}是重新赋值
结果: { "_id" : ObjectId("511078ad857b699e9eaaf516"), "homer" : 3 }
删除: db.foo.remove({"homer":3});
复合插入:
> t={"homer":2, "name" : {"name1" : "yang", "name2" : "gang"} }
{ "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
> db.foo.insert(t);
> db.foo.find();
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }

复合查询:
> db.foo.find();              // 先查看集合中所有记录
{ "_id" : ObjectId("5110ca1aaf69ad089b233fff"), "homer" : 222 }
{ "_id" : ObjectId("5110caffaf69ad089b234000"), "homer" : 222 }
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }

> db.foo.find({"homer":2});           // 查询包含特定内容的记录
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }

MongoDB创建完整示例:
> use test2                // test2数据库不存在也可以执行,但不会立刻创建,需要执行insert操作时才创建
switched to db test2
> show dbs                 // 没有test2,表明不是立刻创建
local   (empty)
test    0.0625GB
>
> db                       // 显示当前正在使用的数据库,test2不存在但正在使用中
test2
> db.createCollection("t2_test")     // 创建集合
{ "ok" : 1 }
> t={"name": "yanggang", "sex" : "male", "lover" : { "lover1" : "little dog", "lover2" : "fish" }}           // 初始化集合数据
{
        "name" : "yanggang",
        "sex" : "male",
        "lover" : {
                "lover1" : "little dog",
                "lover2" : "fish"
        }
}
> db.t2_test.insert(t)            // 插入数据,此刻才会创建test2数据库
> db.t2_test.find()               // 查询
{ "_id" : ObjectId("5110d685af69ad089b234002"), "name" : "yanggang", "sex" : "male", "lover" : { "lover1" : "little dog", "lover2" : "fish" } }
> show dbs                        // 查看数据库,多了test2
local   (empty)
test    0.0625GB
test2   0.0625GB
MongoDB删除示例:
> show collections        // 显示集合
system.indexes
t2_test
> db.t2_test.drop()       // 删除集合t2_test
true
> show collections        // 验证删除成功
system.indexes
> db.test2.remove()
> show dbs                // 显示数据库
local   (empty)
test    0.0625GB
test2   0.0625GB
> db                      // 显示当前数据库
test2
> db.dropDatabase()       // 删除数据库
{ "dropped" : "test2", "ok" : 1 }
> show dbs                // 验证删除成功
local   (empty)
test    0.0625GB

MongoDB 索引

> db.foo.find()
{ "_id" : ObjectId("5110ca1aaf69ad089b233fff"), "homer" : 222 }
{ "_id" : ObjectId("5110caffaf69ad089b234000"), "homer" : 222 }
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
> db.foo.getIndexes()                                                // 查看索引(_id为默认,不可删除和修改)
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.foo",
                "name" : "_id_"
        }
]
> db.foo.ensureIndex({"homer":1})                    // 新建索引
> db.foo.getIndexes()                                                // 验证新建索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.foo",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "homer" : 1
                },
                "ns" : "test.foo",
                "name" : "homer_1"
        }
]
> db.foo.dropIndex({"homer":1})                              // 删除索引
{ "nIndexesWas" : 2, "ok" : 1 }
> db.foo.getIndexes()                                                // 验证删除索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.foo",
                "name" : "_id_"
        }
]

6, 应用示例
> db.foo_test.insert({"homer":1})
> for(var i = 1; i<=5; i++) db.foo_test.save({"homer":2, "score":i})            // 数组生成
> db.foo_test.find()
{ "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }
{ "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }
{ "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ab"), "homer" : 2, "score" : 2 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ae"), "homer" : 2, "score" : 5 }
>
> var cursor = db.foo_test.find(); while(cursor.hasNext())printjson(cursor.next());          // 遍历数组
{ "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }
{ "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }
{ "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ab"), "homer" : 2, "score" : 2 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }
{ "_id" : ObjectId("511103200e2d3a50c56b49ae"), "homer" : 2, "score" : 5 }
>
> var cursor = db.foo_test.find(); printjson(cursor[4])                                                      // 查询(迭代)
{ "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }
> var arr = db.foo_test.find().toArray(); arr[5]                                                             // 查询(数组)
{ "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }
> db.foo_test.find().limit(3)                                                                                                        // 查询(前三)
{ "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }
{ "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }
{ "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文是关于C#类型系统、值类型和引用类型的概念性笔记。介绍了C#1系统类型的三个特性,静态类型的含义,显式类型和隐式类型的区别。还讨论了类、结构、数组类型、枚举、委托类型和接口类型属于哪一种类型。同时纠正了关于结构、引用类型和对象传递的错误表述。最后提到了C#4中使用动态类型的关键字。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 有关phpfgetss()函数的文章推荐10篇
    有关phpfgetss()函数的文章推荐10篇:了解如何使用PHP的各种文件函数。查看诸如fopen、fclose和feof之类的基本文件函数;了解诸如fgets、fgetss和f ... [详细]
author-avatar
台湾菜文
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有