本文主要介绍Mongodb中CRUD常用操作、存储引擎、数据模型,以及如何使用java Driver。
一、BSON
Mongodb中数据存储格式为BSON,和JSON非常类似,可以说在整体的结构几乎一样,只不过BSON定义了更多的数据类型,这对面向对象编程语言非常友好。
{
"_id": {
"$oid": "55f6c87fdefdd10de72fc024"
},
"name": "zhangsan",
"age": 30,
"is_alive": true,
"addresses": [
"beijing",
"shanghai"
],
"created": {
"$date": 1442236543707
}
}
文档格式大概如上所示,如果数据类型时JSON不支持的,那么数据类型也将写入文档中,比如date。BSON中有2个比较特殊的类型,其中date对应java中的Date,array对于java中List。其他类型比如boolean,string,int等与java都一一对应。
在mongodb中,一条数据称为一个document,其API类为org.bson.Document,当然Document也是Bson的子类,同时也实现了Map接口,其内部有一个LinkedHashMap作为数据支撑(所以mongodb中字段是有顺序的)。
Document user = new Document()
.append("name", "zhangsan")
.append("age", 30)
.append("is_alive",true)
.append("addresses", Arrays.asList("beijing","shanghai"))
.append("created", new Date());
上述就是创建一个Document的过程,这和操作一个Map其实并没有太大区别。
二、java driver示例
如下简单展示如何使用mongodb java客户端开发,因为下面的例子都是基于JAVA的。具体参见:“mongodb java”
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.0.3</version>
</dependency>
创建MongoClient的方式有多种,可以参看MongoClient的构造方法即可。最终归结来由2个主要方式,一个是MongClient + MongoClientOptions,另一个是MongClient + conenctionString。例子如下,如果想在spring环境中使用,请你继续封装。关于授权登陆,SSL方面,稍后会专门介绍,此处仅为示例:
MongoClient mongoClient = new MongoClient("127.0.0.1", 27017);
//MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://127.0.0.1:27017"));
MongoDatabase db = mongoClient.getDatabase("test");//获取DB
MongoCollection<Document> collection = db.getCollection("user");//获取collection(表)
//通过collection进行CRUD操作
CRUD的例子将会在下文中列举。
三、Read操作
即从mongodb中读取一条或者多条数据,可以在query中使用多种复合查询条件,这种查询条件的组合类似于SQL,我们也可以使用“projection”过滤器来指定需要返回的结果中包含(不包含)哪些字段,以提升IO效率,因为Mongodb可以使用众多的类似于SQL的查询操作,而且支持多种indexes,这或许就是mongodb的亮点所在。(Mongodb之上的SQL引擎:Drill,即使用sql查询mongodb数据)
MongoCollection<Document> collection = db.getCollection("user");//获取collection(表)
//通过collection进行CRUD操作
Bson parent = Filters.eq("name", "zhangsan");
parent = Filters.and(parent,Filters.gt("age", 10));
MongoCursor<Document> cursor = collection.find(parent).sort(new Document("age", 1)).skip(10).limit(5).iterator();
try {
while (cursor.hasNext()) {
Document item = cursor.next();
System.out.println(item.toJson());
}
} finally {
cursor.close();//must be
}
上面例子就是一个典型的query,我们基本上可以通过多种组合,即可完成复杂的查询。我们使用了Filters API来构建查询条件,这是一个便捷的方式。当然开发者也可以自己使用mongodb的“比较指令”来自己封装:
Document filter = new Document("name",new Document("$eq","zhangsan"));
自己封装不仅繁琐而且易于出错,建议使用Filters。
1、比较符
mongodb支持如下几种比较操作,它们均可以在query的查询条件中:$eq(相等,逐字节比较),$gt(大于),$gte(大于等于),$lt(小于),$lte(小于等于),$ne(不等于),$in(值是否在指定的数组中),$nin(值不在制定的数组中)。
2、逻辑判断符
$or:逻辑or,如果document匹配多个条件判断中的一个或者多个,则将此document返回。
$and:逻辑and,document必须匹配全部的判断条件。
$not:逻辑!,$and取反,如果document不匹配条件,则返回此document。比如:"age":{$not:{$gt:16}}表示“获取age不大于16的document”,它的内部检测过程就是“如果此document存在age字段,且大于16的,一律不返回”,言外之意是:如果document中不包含age字段,或者age的值小于等于16的均会返回。
$nor:not or。
3、元素
$exists:检测文档中是否存在此字段,比如: "name":{$exists:true}表示如果name字段存在,则返回此文档。
$type:检测文档中字段的类型,比如:"age":{$type:16}表示如果age字段的类型为int则返回此文档,参见BSON Types
4、数组
$all:如果字段的值是数组,$all表示此数组中包含指(不一定必须等于)定的所有元