刚开始看的材料来自菜鸟教程:http://www.runoob.com/mongodb/nosql.html
后面看的材料来个网络和书本的整理,出处太多。。
MongoDB在Windows下的管理软件MongoVUE破解版的下载地址是:http://download.csdn.net/detail/sinat_22013331/9552769。记得安装之前先看readme文件
MongoDB 是一个基于分布式文件存储的数据库系统。它是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库中功能最丰富,最像关系型数据库的一款产品
概念区分:
关系型数据库RDMBS(Relational Database Management System), 是将数据组织为相关的行和列的系统,常见的管理软件有Oracle, SQL Server等
NoSQL:非关系型数据库,也称作Not only SQL。
关系型数据库遵循几个准则:
1)原子性:事务中的所有操作要么全都做完,要么全都不作,事务成功的条件是所有操作都成功,否则就是失败,失败时需要回滚,不改变数据库的值。从A账户转100元到B账户,从A账户取钱的操作和存入B账户的操作必须同时完成才算这个事务完成了
2)一致性:数据库要一直处于一致的状态,事务的运行不改变数据库原本的一致性约束,例如a+b=10,a改变的时候,必须改变b
3)独立性:并发的事务之间不会相互影响,两个事务操作同一个数据对象时,只要A事务没有提交,B事务就不受A事务的影响
4)持久性:事务提交之后,它所做的修改会永久的保存在数据库上
分布式系统:分布式系统又多台服务器和相关通信软件通过计算机网络连接起来共同组成的。
分布式系统是建立在网络上的软件系统,包含硬件服务器,通信软件,以及计算机网络。
和关系型数据库将数据存储成一个表不同,MongoDB将数据存储为一个文档,数据结构有键值对组成,类似JSON对象
对比一下MongoDB和关系型数据库的术语之间的差别:
MongoDB基本操作
mongoDB中可以建立多个数据库,默认数据库为db,存储在data目录中。当然我也可以自己设置一个存储空间目录,比如我设置为desc,启动时使用命令 dbpath,就可以将存储目录改成我设置的值,如下所示
从上图可以看出,我的安装目录是D:\MongoDB\mongo\ 而数据存储目录是D:\data\database\
show dbs : 显示所有数据列表
db : 显示当前的数据库列表
use XXX : 连接一个指定的数据库列表,其中XXX表示数据库列表的名称。如果这个数据库存在,就切换到这个数据库下。如果它不存在,就创建它
show collections:查看当前数据库下的所有集合
db.createCollection(name,{capped: <Boolean>, autoIndexId: <Boolean>, size: <number>, max <number>} ) 创建集合
name:集合名
capped:是否启用集合限制,默认不启用
autoIndexId:是否使用_id作为索引,默认使用
size:限制集合使用空间的大小,默认没有限制
max:集合中最大数据条数的限制,默认没有限制
实际上直接使用db.createCollection(name)就可以实现默认的集合创建过程
数据的增删改查
增加一条数据
db.collectionName.insert(document): 向数据库中插入文档,其中文档document的数据结构和JSON基本相同,存储格式为BSON,即Binary JSON。这里的document可以为一条数据,也可以为一串数据
查找一条数据
db.collectionName.find():数据库查询操作。没有参数时,表示查询所有记录。当有参数时,可以按照参数的条件查询。当然,参数中还可以带 and 或者是 or ,多种条件查询。同时,mongoDB提供了几种条件操作符,大于($gt),小于($lt), 大于等于($gte), 小于等于($lte)。类型操作符($type)。Limit()用来限制查找的个数。Skip()用来限制前面跳过的个数
这里只简单查找所有的记录,至于带有条件的查找,后面有好多内容可以说,暂时不作详述
改动/更新 一条数据
db.collectionName.update(query, newData):数据库更新操作,更新操作至少有两个参数,前一个参数表示查询条件,后一个参数表示查询到之后改变的值
删除数据
db.collectionName.remove():数据库删除操作
当函数体内带有参数时,表示删除符合参数条件的数据。当没有参数时,表示删除当前列表中的所有数据。
删除列表或者数据库
db.dropDatabase():删除当前所在的数据库
db.collection.drop():删除当前这个Collection
其他操作
sort(): 排序方法
ensureIndex():创建索引
aggregate():聚合方法,用于处理数据并返回处理后的结果
MongoDB深入理解
数据复制:MongoDB复制是将数据同步在多个服务器上的过程
分片:MongoDB的分片技术就是通过在多台机器上分割数据,使得数据库能够存储和处理更多的数据
数据备份:mongodump
监控:mongostat
性能分析 explain()函数
explain()函数用来分析某个操作的实现过程以及需求。explain有三种模式,或者说是三个层面的分析,分别是 queryPlanner(查询计划的选择器,是explain返回的默认层面),executionStats(执行统计层面,返回统计结果),allPlansExecution(返回所有执行计划的统计)。具体如下所示:
直接使用explain()函数,返回结果只有默认的queryPlanner。如果需要别的统计结果,比如说执行时间什么的,就需要使用executionStats模式。
执行语句为:db.collectionName.find().explain("executionStats")
创建索引
在调用性能分析函数之后,我们发现查找某条数据花费的时间太长,此时为了降低查询时间,需要对表单建立索引。
db.collectionName.ensureIndex("name":1)创建索引,其中name为某个字段,1表示升序排列,也可为-1,表示降序排列。
此时可以看到,索引创建已经成功
索引创建之后,和关系型数据库类似,创建索引之后,索引都要和数据库同步,所以太多索引会影响数据库服务器的性能,有时候也要适当的删除某些索引。首先查看都创建了那些索引
db.collectionName.getIndexes():查看创建的索引
从上面可以看出,有两个索引,其中key为_id的是默认索引,它的name是"_id_"
另外一个索引是我们刚刚建好的,它的key为“name”,按照升序排列。这条索引的name是“name_1”
现在来做删除索引的操作:
db.collectionName.dropIndex(“indexName”):删除索引
此时可以看到,删除索引已经成功了
MongoVUE的使用
关于MongoDB的管理软件,因为最近在写C#,所以用的平台是Windows,懒得装PHP运行环境,就没有用Rockmongo,而测试了Robomongo,也感觉不好用,最后还是选用了MongoVue。这里提供一个破解版,下载地址见文章首部。
管理软件安装结束之后,打开MongoDB服务器,打开管理软件连接到服务器,此时如果数据库是默认条件下打开的,那么MongoVUE的collection列表是没法检测到,也没法新建的。这是因为MongoDB 3.2之后默认启动的是wiredTiger引擎,这个引擎和之前的引擎不同,而管理软件匹配的还是之前的引擎,所以无法使用。
此时要重新启动MongoDB服务器。启动命令是: mongod --storageEngine mmapv1 --dbpath XXXXX, 其中XXXXX是你的数据库存储路径。这样启动之后,再使用MongoVUE连接数据库服务器就可以了。
可以看到,管理软件左侧是:
First是服务器名称
下属两个数据库 blyang和local
blyang数据库下存放的列表放在Collections里面,这里可以看到有个名为coll的列表
而列表下面存放的索引,这里只有一个默认的索引 _id_
而且MongoVUE提供了三种方式来查看列表数据,分别是树形,列表和JSON方式。如下图所示:
MongoDB Java操作
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
public class Main {
public static void main(String[] args) {
try{
//创建连接
MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
MongoDatabase mongoDatabase = mongoClient.getDatabase("blyang");
System.out.println("connect success");
// //创建集合
// mongoDatabase.createCollection("coll");
// System.out.println("collection create success");
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection("coll");
// //插入文档
// Document document = new Document("title", "MongoDB_FirstInsert")
// .append("description", "database")
// .append("likes", 100)
// .append("by", "yang");
// List<Document> documents = new ArrayList<Document>();
// documents.add(document);
// collection.insertMany(documents);
// System.out.println("insert success");
// //查询文档
// FindIterable<Document> findIterable = collection.find();
// MongoCursor<Document> mongoCursor = findIterable.iterator();
// while( mongoCursor.hasNext() ){
// System.out.println( mongoCursor.next() );
// }
//更新文档
// 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.out.println(e.getMessage());
System.out.println("error");
}
}
}