Basic Concept:
- 词义解析:mongo 并不是mango(芒果)之意,在拉丁语中mongo 是“巨大”之意。是一种介于关系型与非关系型数据库之间的NoSql(Not only SQL)
- mongodb 中文网站:www.mongoing.com
- mongodb 中文文档:docs.mongoing.com
- nosql 数据库相比传统 sql 数据库少了:实时一致性;事务;多表联合查询。
杀掉 MongoDB 的进程需使用kill -15或不带参数,不能使用kill -9
SpringBoot 应用mongodb
spring-data-mongodb主要有以下注解
@Id
主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。如果自己不设置@Id主键,mongo会自动生成一个唯一主键(_id, ObjectId, 生成规则:UNIX时间戳 +MongoDB的机器 +生成此_id的进程 +随机数),并且插入时效率远高于自己设置主键。
在实际业务中不建议自己设置主键,应交给mongo自己生成,自己可以设置一个业务id,如int型字段,用自己设置的业务id来维护相关联的表。@Document
标注在实体类上,类似于hibernate的entity注解,标明由mongo来维护该表。//org.springframework.data.mongodb.core.mapping.Document.class
//把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
@Document(collection=”mongodb 对应 collection 名”)
// 若未加 @Document ,该 bean save 到 mongo 的 user collection
// 若添加 @Document ,则 save 到 reUser collection
@Document(collection=”reUser“)
public class User{
}@Indexed
声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
唯一索引的话是@Indexed(unique = true)。
也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。
也可以对整个Document进行索引,排序是预定义的按插入BSON数据的先后升序排列。
也可以对关联的对象的字段进行索引,譬如User对关联的address.city进行索引。(注解怎么写还不清楚,待查)@CompoundIndex
复合索引,加复合索引后通过复合索引字段查询将大大提高速度。@Document
@CompoundIndexes({
@CompoundIndex(name = “age_idx”, def = “{‘lastName’: 1, ‘age’: -1}”)
})
public class Person {
}
写法如上,lastName和age将作为复合索引,数字参数指定索引的方向,1为正序,-1为倒序。方向对单键索引和随机存不要紧,但如果你要执行分组和排序操作的时候,它就非常重要了。@Field
代表一个字段,可以不加,不加的话默认以参数名为列名。
给映射存储到 mongodb 的字段取别名
在 java bean 中字段名为 firstName,存储到 mongo 中 key 为 fName@Field(“fName”)
private String firstName;@Transient
被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。@DBRef
关联另一个document对象。类似于mysql的表关联,但并不一样,mongo不会做级联的操作。
先来看一下不加DBRef时,mongo保存数据的情况:
Article类有String title,List pictureList,两个属性,Picture有一个url,一个desc属性。新建数个Picture对象,并赋值给Article的list,执行Article的insert操作,
list会作为普通的数据存到article里, 并不会为Picture建表,这一点是区别于mysql的级联存储的。 如果给Article的List pictureList 加上注解:@DBref
List<> pictureList;
然后分别做两个集合的持久化(save)
此时,发现就不再是直接显示的Picture的各个属性了,而是只保存了Picture的id和namespace,同时仍然没有创建Picture的collection(等同于mysql的表)。
spring-boot 应用mongodb
- gradle 中引入mongodb 的包: compile(“org.springframework.boot:spring-boot-starter-data-mongodb:1.5.7.RELEASE”)
- 多个IP集群可以采用以下配置: spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
- 创建实体类
- 引入mongodbTemplate
- mongodb 连接池
官方文档:
Note: The Mongo object instance actually represents a pool of connections to the database; you will only need one object of class Mongo even with multiple threads. See the concurrency doc page for more information.
The Mongo class is designed to be thread safe and shared among threads. Typically you create only 1 instance for a given DB cluster and use it across your app. If for some reason you decide to create many mongo intances, note that:
all resource usage limits (max connections, etc) apply per mongo instance
to dispose of an instance, make sure you call mongo.close() to clean up resources.
mongo实例其实已经是一个现成的连接池了,而且线程安全。这个内置的连接池默认初始了10个连接,每一个操作(增删改查等)都会获取一个连接,执行操作后释放连接。