zoukankan      html  css  js  c++  java
  • MongoDB入门简单介绍

    有关于MongoDB的资料如今较少,且大多为英文站点,以上内容大多由笔者翻译自官网,请翻译或理解错误之处请指证。之后笔者会继续关注MongoDB,并翻译“Developer Zone”和“Admin Zone”的相关内容,敬请期待下期内容。

    MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方式。

    它的特点是高性能、易部署、易使用,存储数据很方便。主要功能特性有:
    *面向集合存储,易存储对象类型的数据。
    *模式自由。
    *支持动态查询。
    *支持全然索引,包括内部对象。
    *支持查询。
    *支持复制和故障恢复。
    *使用高效的二进制数据存储,包括大型对象(如视频等)。
    *自己主动处理碎片,以支持云计算层次的扩展性
    *支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
    *文件存储格式为BSON(一种JSON的扩展)
    *可通过网络訪问

    所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每一个集合在数据库中都有一个唯一的标识名,而且能够包括无限数目的文档。集合的概念相似关系型数据库(RDBMS)里的表(table),不同的是它不须要定义不论什么模式(schema)。
    模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不须要知道它的不论什么结构定义。假设须要的话,你全然能够把不同结构的文件存储在同一个数据库里。
    存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则能够是各中复杂的文件类型。我们称这样的存储形式为BSON(Binary Serialized dOcument Format)。

    MongoDB服务端可执行在Linux、Windows或OS X平台,支持32位和64位应用,默认port为27017。推荐执行在64位平台,由于MongoDB

    在32位模式执行时支持的最大文件尺寸为2GB。

    MongoDB把数据存储在文件里(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。

    安装:
    Linux/OS X下:
    1 建立数据文件夹
     mkdir -p /data/db
    2 下载压缩包
     curl -O http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz
    3 解压缩文件
     tar xzf mongodb-linux-i386-latest.tgz
    4 启动服务
     bin/mongod run &
    5 使用自带client连接
     /bin/mongo
    6 測试
     db.foo.save( { a : 1 } )
     db.foo.findOne()

    windows下:
    1 建立数据文件夹c:/data/db
    2 下载压缩包,解压文件
    3 启动服务
     bin/mongod.exe run
    4 自带client
     bin/mongon.exe

    在LINUX和WINDOWS系统下的使用大同小异,不同的地方主要是默认的数据存储文件夹。LINUX类系统下存放在/data/db下,而WINDOWS

    会存放在C:/data/db下。能够在启动时使用--dbpath參数指定存储文件夹并启动。如:bin/mongod.exe --dbpath d:/data/mongo

    经常使用启动參数:
    run 直接启动。例:./mongod run
    --dbpath 指定特定存储文件夹启动,若文件夹不存在则创建。例:./mongod --dbpath /var/data/mongo
    --port 指定端口启动。例:./mongod --port 12345

    停止MONGO服务:
    方法1:服务端停止,可使用Ctrl+C
    方法2:在client停止,可先连接client
     ./mongo
     并使用命令
     db.shutdownerver()
     然后退出client
     exit

    使用JAVA语言操作MONGODB很easy,仅仅要将驱动文件增加到CLASSPATH中就能够使用。

    1 建立连接
      要建立MongoDB的连接,你仅仅要指定要连接到的数据库就能够。这个数据库不一定存在,假设不存在,MongoDB会先为你建立这个

    库。同一时候,在连接时你也能够详细指定要连接到的网络地址和port。以下的是连接本机数据库的一些样例:

    import com.mongodb.Mongo;
    import com.mongodb.DBCollection;
    import com.mongodb.BasicDBObject;
    import com.mongodb.DBObject;
    import com.mongodb.DBCursor;
    import com.mongodb.MongoAdmin;

    Mongo db = new Mongo("mydb");
    Mongo db = new Mongo("localhost", "mydb");
    Mongo db = new Mongo("localhost", 27017, "mydb");

    2 安全验证(非必选)
    MongoDB服务能够在安全模式执行,此时不论什么client要连接数据库时需使用username和password。在JAVA中可使用例如以下方法连接:

    boolean auth = db.authenticate(userName, password);

    假设usernamepassword验证通过,返回值为true,否则为false

    3 获取集合列表
    每一个数据库都存在零个或多个集合,须要时你能够获得他们的列表:

    Set<String> colls = db.getCollectionNames();
    for(String s : colls){
     System.out.println(s);
    }

    4 获得一个集合
    要获得某个特定集合,你能够指定集合的名字,并使用getCollection()方法:

    DBCollection coll = db.getCollection("testCollection");

    当你获取了这个集合对象,你就能够对数据进行增删查改之类的操作。

    5 插入文档
    当你获得了一个集合对象,你就能够把文档插入到这个对象中。比如,存在一个JSON式的小文档:
    {
     "name" : "MongoDB",
     "type" : "database",
     "count" : 1,
     "info" : {
       x : 203,
       y : 102
      }
    }
    请注意,这个文档包括一个内部文档。我们能够使用BasicDBObject类来创建这个文档,而且使用insert()方法方便地将它插入到集

    合中。

    BasicDBObject doc = new BasicDBObject();
    doc.put("name", "MongoDB");
    doc.put("type", "database");
    doc.put("count", 1);

    BasicDBObject info = new BasicDBObject();
    info.put("x", 203);
    info.put("y", 102);

    doc.put("info", info);

    coll.insert(doc);

    6 使用findOne()查找集合中第一个文档
    要查找我们上一步插入的那个文档,能够简单地使用findOne()操作来获取集合中第一个文档。这种方法返回一个单一文档(这是相对于使用DBCursor的find()操作的返回),这对于仅仅有一个文档或我们刚插入第一个文档时非常实用,由于此时并不须要使用光标。

    DBObject myDoc = coll.findOne();
    System.out.println(myDoc);

    返回相似:
    {
     "_id" : "ac907a1f5b9d5e4a233ed300" ,
     "name" : "MongoDB" ,
     "type" : 1 ,
     "info" : {
      "x" : 203 ,
      "y" : 102} ,
     "_ns" : "testCollection"
    }

    注意_id和_ns元素是由MongoDB自己主动增加你的文档。记住:MongoDB内部存储使用的元素名是以“_”做为開始。

    7 增加多种文档
    为了做很多其它有趣的查询试验,让我们向集合中增加多种文档类型,象:
    {
     "i" : value
    }
    能够通过循环来实现

    for(int i = 0; i < 100; i++){
     coll.insert(new BasicDBObject().append("i", i));
    }

    注意我们能够在一个集合中插入不同类型的文档,这就是我们所说的“模式自由”(schema-free)。

    8 统计文档数量
     使用getCount()方法

    System.out.println(coll.getCount());

    9 使用光标(cursor)来获取所有文档
    为了获取集合中的所有文档,我们能够使用find()方法。这种方法返回一上DBCursor对象,来同意我们将符合查询条件的文档迭代

    出来。

    DBCursor cur = coll.find();
    while(cur.hasNext()){
     System.out.println(cur.next());
    }

    10 在查询中获取单一文档
    我们能够创建一个查询,并传递给find()方法来获取集合中全部文档的一个子集。比如,我们想要查询域名为"i",而且值为71的文档:

    BasicDBObject query = new BasicDBObject();
    query.put("i", 71);
    cur = coll.find(query);
    while(cur.hasNext()){
     System.out.println(cur.next());
    }

    11 使用条件查询获取集合
    比如,我们想要查询全部i>50的文档:

    BasicDBObject query = new BasicDBObject();
    query.put("i", new BasicDBObject("$gt", 50));
    cur = coll.find(query);
    while(cur.hasNext()){
     System.out.println(cur.next());
    }

    当然,我们也能够做20 < i <= 30的查询

    BasicDBObject query = new BasicDBObject();
    query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
    cur = coll.find(query);
    while(cur.hasNext()){
     System.out.println(cur.next());
    }

    12 创建索引
    MongoDB支持索引,并且非常easy在集合上添加索引。要创建索引,仅仅须要指定要加索引的属性,并且指定升序(1)或降序就可以(-1)。

    coll.createIndex(new BasicDBObject("i", 1));

    13 获取索引列表

    List<DBObject> list = coll.getIndexInfo();
    for(DBObject o : list){
     System.out.println(o);
    }

    14 MongoDB管理函数
    管理函数在com.mongodb.MongoAdmin类中定义。
    例A:获取数据库列表
     MongoAdmin admin = new MongoAdmin();
     for(String s : admin.getDatabaseNames()){
      System.out.println(s);
     }

    例B:获取数据库对象
     Mongo m = admin.getDB("mydb");

    例C:删除数据库
     admin.dropDatabase("mydb");

    15 用DBObject存储JAVA对象
    MongoDB for JAVA驱动中提供了用于向数据库中存储普通对象的接口DBObject
    比如,存在一个须要存储的对象类Tweet
    public class Tweet implements DBObject{
     /*...*/
    }
    能够使用例如以下代码:

    Tweet myTweet = new Tweet();
    myTweet.put("user", userId);
    myTweet.put("message", message);
    myTweet.put("date", new Date());

    collection.insert(myTweet);

    当一个文档从MongoDB中取出时,它会自己主动把文档转换成DBObject接口类型,要将它实例化为你的对象,需使用

    DBCollection.setObjectClass()。
    collection.setObjectClass(Tweet);
    Tweet myTweet = (Tweet)collection.findOne();

    16 JAVA驱动的并发性
    JAVA的MongoDB驱动是线程安全的。假设你将它用在WEB服务中,能够创建它的一个单例,并在全部请求中使用它。

    然而,假设你须要在一个会话(比如HTTP请求)中保证事务一致性,或许你会希望在这个会话中对驱动使用同一个port。这只在

    请求量很大的环境中,比如你常常会读取刚写入的数据。
    为了这一点,你须要使用例如以下代码:
    Mongo m;
    m.restartStart();

    // code.........

    m.requestDone();


    以上介绍了简单的mongoDB使用,很多其它信息请查阅MongoDB API for Java。

    官方主页:http://www.mongodb.org/display/DOCS/Home

  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3755962.html
Copyright © 2011-2022 走看看