mongoDB 学习

来源:互联网 发布:windows应用软件开发 编辑:程序博客网 时间:2024/05/21 14:57

   Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql)   (存储类型:文档存储)

* MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
  面向集合的存储:
* MongoDB 中,一个数据库包含多个集合,类似于MySql中一个数据库包含多个表;
  一个集合包含多个文档,类似于MySql中一个表包含多条数据
1、数据库
  一个mongoDB可以创建多个数据库
  使用show dbs可以查看所有数据库的列表
  执行db命令则可以查看当前数据库对象或者集合
  运行use命令可以连接到指定的数据库
2、文档
  文档是mongoDB的核心。多个键及其关联的值放在一起就是文档。
  在mongodb中使用一种类json的bson存储数据,bson数据可以理解为在json的基础上添加了一些json中没有的数据类型
3、文档的逻辑联系
   关系1:嵌入式关系
   关系2:引用式关系(通过引用文档的_id字段来建立关系)
4、集合
   集合就是一组文档的组合,就相当于是关系数据库中的表,在mongodb中可以存储不同的文档结构的文档
   {"company":"Chenshi keji"} {"people":"man","name":"peter"} 
5、元数据
   数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.*  (DBNAME可用db或数据库名替代)
DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户

DBNAME.system.sources :列出服务器信息

******************************************************************************************************************

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
mongodb://localhost                     -连接本地数据库服务器,端口是默认的
mongodb://admin:123456@localhost/test   -使用用户名和密码连接登陆到指定数据库

******************************************************************************************************************
sudo service mongodb start  -(linux环境下启动MongoDB服务)

use mydb      -使用 use 命令创建或切换数据库
db            -查看当前连接的数据库
show dbs      -查看所有的数据库  (刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 runoob 数据库插入一些数据
db.dropDatabase()    -使用 db.dropDatabase() 销毁数据库
******************************************************************************************************************
use mydb
db.createCollection("users")     -在数据库 mydb 中创建一个集合
db.createCollection("users", { capped : 1, autoIndexID : 1, size : 6142800, max : 10000 } ) 
show collections                 -查看创建的集合
db.users.drop()                  -删除集合的方法:(删除 users 集合)

向集合中插入数据(使用 insert()或者使用 save(),插入数据时,如果 users 集合没有创建会自动创建):
db.users.insert([
  { name : "jam",
    email : "jam@qq.com"
   },
  { name : "tom",
    email : "tom@qq.com"
   }
  ])
==========================================================================
db.post.find()             -查询数据,不加任何参数默认返回所有数据记录
db.post.find().pretty()    -pretty() 可以使查询输出的结果更美观
==========================================================================
* MongoDB中的 AND:
   当 find() 中传入多个键值对时,MongoDB就会将其作为 AND 查询处理。
   用法:db.mycol.find({ key1: value1, key2: value2 }).pretty()
db.post.find({"by":"shiyanlou","title": "MongoDB Overview"}).pretty()

* MongoDB中的 OR
   MongoDB中,OR 查询语句以 $or 作为关键词
db.post.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
==========================================================================
更新文档:
db.shiyanlou.update({"user_id":"02","e-mail":"test@qq.com"},
                    {$set:{"e-mail":"group@qq.com"}})

删除文档:
db.shiyanlou.remove({"name":"Bob"})
==========================================================================
* mongodb中的条件操作符有:
(>) 大于 - \$gt #greate
(<) 小于 - \$lt #low
(>=) 大于等于 - \$gte #equal
(<= ) 小于等于 - \$lte
db.shiyanlou.find({user_id:{$gt:1}})
db.shiyanlou.find({user_id:{$lte:2,$gt:1}})

* type的值:
双精度型-1
字符串-2
对象-3
数组-4
二进制数据-5
对象ID-7
布尔类型-8
数据-9
空-10
正则表达式-11
JS代码-13
符号-14
有作用域的JS代码-15
32位整型数-16
时间戳-17
64位整型数-18
Min key-255
Max key-127
db.shiyanlou.find({"name":{$type:2}})

* limit与skip:
db.shiyanlou.find().limit(1)           -读取指定数量的数据记录 -limit(读取一条记录,默认是排在最前面的那一条被读取)
db.shiyanlou.find().limit(1).skip(1)   -读取时跳过指定数量的数据记录 -skip

* MongoDB排序 -sort()
db.shiyanlou.find().sort({"time":1})   -升序用1表示,降序用-1表示

* 聚合 -aggregate()

* 原子操作(所谓原子操作,就是要么执行成功,要么执行失败,执行成功完成既定任务,执行失败还原执行前的状态)
  $set:用来指定一个键并更新键值,若键不存在并创建。
{ $set : { field : value } }
  $unset:用来删除一个键。
{ $unset : { field : 1} }
  $push:把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去
{ $push : { field : value } }
  $rename:修改字段名称
{ $rename : { old_field_name : new_field_name } }
******************************************************************************************************************
* 索引 - ensureIndex()  (索引通常能够极大的提高查询的效率)
  索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,
  索引是对数据库集合中一个文档或多个文档的值进行排序的一种结构
语法:db.COLLECTION_NAME.ensureIndex({KEY:1|-1})      -创建一个索引(同样1代表升序,-1代表降序)
db.shiyanlou.ensureIndex({"name":1})   
db.users.ensureIndex({"tags":1})       
db.users.find({tags:"cricket"})            -创建索引后,我们可以这样检索集合的 tags 字段
db.users.find({tags:"cricket"}).explain()  -explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化

******************************************************************************************************************

* MongoDB 分片
 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。
 这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据
* 三个主要组件:
Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
******************************************************************************************************************
* MongoDB Java
  在 Java 程序中如果要使用 MongoDB,你需要确保已经安装了 Java 环境及 MongoDB JDBC 驱动
  1、首先你必须下载mongo jar包 (mongo-java-driver-3.2.2.jar)
                <!-- mongo-java-driver驱动 -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
  2、连接数据库(无需用户名密码验证),你需要指定数据库名称,如果指定的数据库不存在,mongo会自动创建数据库
  import com.mongodb.MongoClient;
  import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
   public static void main( String args[] ){
      try{   
       // 连接到 mongodb 服务
         MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
       
         // 连接到数据库
         MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");  
       System.out.println("Connect to database successfully");
        
      }catch(Exception e){
        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
     }
   }
}
  3、连接数据库(需要验证用户名及密码)
import java.util.ArrayList;  
import java.util.List;  
import com.mongodb.MongoClient;  
import com.mongodb.MongoCredential;  
import com.mongodb.ServerAddress;  
import com.mongodb.client.MongoDatabase;  
public class MongoDBJDBC {  
    public static void main(String[] args){  
        try {  
            //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址  
            //ServerAddress()两个参数分别为 服务器地址 和 端口  
            ServerAddress serverAddress = new ServerAddress("localhost",27017);  
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();  
            addrs.add(serverAddress);  
              
            //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码  
            MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());  
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();  
            credentials.add(credential);  
              
            //通过连接认证获取MongoDB连接  
            MongoClient mongoClient = new MongoClient(addrs,credentials);  
              
            //连接到数据库  
            MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");  
            System.out.println("Connect to database successfully");  
        } catch (Exception e) {  
            System.err.println( e.getClass().getName() + ": " + e.getMessage() );  
        }  
    }  
}
  4、创建集合、获取集合、插入文档、检索所有文档、更新文档、删除文档
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;

public class MongoDBJDBC{
   public static void main( String args[] ){
      try{   
      // 连接到 mongodb 服务
      MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
                
      // 连接到数据库
      MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");  
      System.out.println("Connect to database successfully");

      //创建集合
      mongoDatabase.createCollection("test");
      System.out.println("集合创建成功");

      //获取集合
      MongoCollection<Document> collection = mongoDatabase.getCollection("test");
      System.out.println("集合 test 选择成功");

      //插入文档  
         /** 
         * 1. 创建文档 org.bson.Document 参数为key-value的格式 
         * 2. 创建文档集合List<Document> 
         * 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document) 
         * */
         Document document = new Document("title", "MongoDB").  
         append("description", "database").  
         append("likes", 100).  
         append("by", "Fly");  
         List<Document> documents = new ArrayList<Document>();  
         documents.add(document);  
         collection.insertMany(documents);  
         System.out.println("文档插入成功");

      //检索所有文档  
         /** 
         * 1. 获取迭代器FindIterable<Document> 
         * 2. 获取游标MongoCursor<Document> 
         * 3. 通过游标遍历检索出的文档集合 
         * */  
         FindIterable<Document> findIterable = collection.find();  
         MongoCursor<Document> mongoCursor = findIterable.iterator();  
         while(mongoCursor.hasNext()){  
            System.out.println(mongoCursor.next());  
         } 
        
      //更新文档   将文档中likes=100的文档修改为likes=200   
        collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));

      //删除符合条件的第一个文档  
        collection.deleteOne(Filters.eq("likes", 200));  
      //删除所有符合条件的文档  
        collection.deleteMany (Filters.eq("likes", 200));

      }catch(Exception e){
        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
     }
   }
}

0 0
原创粉丝点击