zoukankan      html  css  js  c++  java
  • 【转载】Mongodb从配置到应用

    早就想写一篇Mongodb的文章了,苦于木有时间呀,今天抽空将我所学习到的Mongodb知识整合一下,分享出来,部分Mongodb知识来源于网络.此处不给出链接,如果有侵犯,请及时联系我...

    一,Mongodb简介

    Mongo(http://www.mongodb.org/)是一个高性能,开源(代震军大牛正在研究Mongodb的源码,大家可以去看看http://www.cnblogs.com/daizhj/),模式自由(schema-free)的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值(key-value)存储方式。Mongo使用C++开发,

    具有以下特性:

    1. 面向集合的存储:适合存储对象及JSON形式的数据。
    2. 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
    3. 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
    4. 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
    5. 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
    6. 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
    7. 自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。
    8. 模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
    9. 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。

    使用场合:

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

    所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。

    二,Ubuntu 下配置Mongodb

    Ubuntu知识扫盲:

    chown -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)

    nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

    Mongodb目前最新版本是1.8.1
    首先启动终端 :
    输入 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz
    下载mongodb-linux-i686-1.8.1.tgz安装包
    解压 tar -zxvf mongodb-linux-i686-1.8.1.tgz

    默认情况下Mongodb会在/data/db/ 这个文件夹存放数据

    在当前目录下输入如下命令,创建用户 :
    //添加一个mongodb用户
    adduser mongodbxiao
    //设置密码
    passwd mongodb
    3

    继续输入

    sudo mkdir -p /data/db/
    //把"/data/db/”的属主改成mongodb用户
    $ sudo chown mongodbxiao /data/db/
    $ chown -R mongodb:mongodbxiao /data
    当然 可以 通过--dbpath 命令 指定MongoDB将数据存储到另外的目录中去。

    在运行下面的语句之前需要安装一下mongo shell 否则会收到提示:程序“mongo”尚未安装。
    apt-get install mongodb-clients

    运行数据库
    $  ./mongodb-linux-i686-1.8.1/bin/mongod
    $ ./mongodb-linux-i686-1.8.1/bin/mongo
    > db.test.save({123123:'哈哈哈'})
    > db.test.find(); 

    创建数据库并添加一条记录,最后查询结果:
    2

    到此证明我们在Ubuntu下配置Mongodb成功..

    ps:使用Ubuntu过程中经常会遇到这个错误:

    1

    只需要输入强制解锁,命令即可解决。

    sudo rm /var/cache/apt/archives/lock

    sudo rm /var/lib/dpkg/lock

    三,Mongodb客户端管理工具

    Try MongoDB

    不用安装就可以试用MongoDB,和tryredis一样,是一个基于web的shell模拟工具,可以让你在不用安装MongoDB的情况下试用MongoDB的各种功能.

    Mongo3 – MongoDB 集群管理工具

    MongoVUE

    一个windows下的客户端管理工具,我推荐这个,非常不错.有点类似于mysql管理工具..

    5

    四,Mongodb C#版驱动

    第一款:mongodb-csharp 项目地址:http://github.com/samus/mongodb-csharp

    简单介绍:该驱动是比较全的驱动,更新随度非常快,有人已经应用到项目中去,并且表现非常好。目前他们的团队正在致力于连接管理这部分功能的扩展例如:自动重连,连接池等等。

    第二款:mongodb-net 项目地址:http://code.google.com/p/mongodb-net/

    简单介绍:该开发还在进行中,有些功能还没有实现。

    第三款:MongoDB.Emitter 项目地址:http://bitbucket.org/gwbasic/mongodb.emitter/

    简单介绍:提供了强类型支持

    第四款:CSMongo 项目地址:http://somewebguy.wordpress.com/2010/02/21/building-a-mongo-driver-part-1/

    简单介绍:实现了部分功能,并且没有可下载的代码。但是你可以看他的博客以了解这种驱动的思想。

    第五款:simple- mongodb 项目地址:http://code.google.com/p/simple-mongodb/

    简单介绍:没有提供源代码,以JSon为核心。

    最后一个是对第一款某些地方的增强,地址http://deserialized.com/convert-csharp-classes-to-and-from-mongodb-documents-automatically-using-net-reflection

    第六款:NoRM 项目地址:http://github.com/atheken/NoRM

    介绍:增强了第一种,支持强类型。

    五,Mongodb 与sql 语句对照

    此处用mysql中的sql语句做例子,C# 驱动用的是samus,也就是上文中介绍的第一种.

    引入项目MongoDB.dll

    //创建Mongo连接
      var mongo = new Mongo("mongodb://localhost");
      mongo.Connect();
      //获取一个数据库,如果没有会自动创建一个
      var db = mongo.GetDatabase("movieReviews");
      //创建一个列表,并为这个列表创建文档
      var movies = db.GetCollection("movies");

    连接没问题之后,现在让我们用mysql 与mongodb的一些语句做下对比:

      MongoDB Mysql
    查询全部 movies.find(new Document()) SELECT * FROM movies
    条件查询 movies.Find(new Document { { "title", "Hello Esr" } }); SELECT * FROM movies WHERE title= 'foobar'
    查询数量 movies.Find(new Document { { "title", "测试2" } }).Documents.Count(); SELECT COUNT(*) FROM movies WHERE `title` = 'foobar'
    数量范围查询 1, movies.Find(new Document().Add("$where", new Code("this.num > 50")));

    2, movies.Find(new Document().Add("num",  new Document().Add("$gt",50)));
    ($gt : > ; $gte : >= ; $lt : < ; $lte : <= ; $ne : !=)

    3,movies.Find("this.num > 50");

    4,movies.Find(new Document().Add("$where",new Code("function(x){ return this.num > 50};")));
    select * from movies where num > 50
    分页查询 movies.Find(new Document()).Skip(10).Limit(20); SELECT * FROM movies  limit 10,20
    查询排序语句 movies.Find(new Document()).Sort(new Document() { { "num", -1 } }); SELECT * FROM movies ORDER BY num DESC
    查询指定字段 movies.Find(new Document().Add("num", new Document().Add("$gt", 50)), 10, 0, new Document() { { "title", 1 } }); select title from movies where num > 50
    插入语句 movies.Insert(new Document() { { "title", "测试" }, { "resuleData", DateTime.Now } }); INSERT INOT movies (`title`, `reauleDate`) values ('foobar',25)
    删除语句 movies.Remove(new Document() { { "title", "Hello Esr" } }); DELETE * FROM movies
    更新语句

    movies.Update(new Document() { { "title", "测试2" } }
                 , new Document() { { "title", "测试11111" } });

    UPDATE movies SET `title` = ‘测试1111’ WHERE `title` = '测试1111'
    Linq查询

    (from item in db.GetCollection("movies").Linq()
                           where ((string)item["title"]).StartsWith("Esr")
                           select item);

    select * from movies where title like ‘%Esr’

    这里只举出了几个比较典型的例子,可以这么说,只要mysql可以完成的sql语句,在mongodb里面都可以实现.

    --------------

  • 相关阅读:
    简易sql拼接工具类(使用StringBuilder实现)
    缓存工具类(使用ConcurrentMap集合实现)
    properties文档读取工具类
    【Codeforces Round #655 (Div. 2)】A-D
    【2020 杭电多校第四场】Go Running 最小点覆盖
    【2020 杭电多校第四场】1002 Blow up the Enemy
    【2020 HDU 多校训练第三场 1007 Tokitsukaze and Rescue】暴力删边&最短路
    【2020杭电多校第二场】Total Eclipse 思维+并查集
    【2020HDU多校】Lead of Wisdom 暴力
    【CF-1371 C-E2】
  • 原文地址:https://www.cnblogs.com/fx2008/p/2278321.html
Copyright © 2011-2022 走看看