基本概念
MongoDB中的几个基本概念:数据库,集合,文档数据库
数据库是一个物理容器集合。每个数据库都有自己的一套文件系统上的文件。一个单一的MongoDB服务器通常有多个数据库。
集合
集合是一组MongoDB的文档。它相当于一个RDBMS表。收集存在于一个单一的数据库。集合不执行模式。集合内的文档可以有不同的领域。
通常情况下,一个集合中的所有文件是相同或相关的目的。
文档
文档是一组K - V对。文件动态模式。动态模式是指,在相同集合中的文档不需要具有相同的字段或结构组的公共字段的集合的文档,可以容纳不同类型的数据。
mongodb命令
启动mongo:mongod -dbpath="数据文件夹路径"mongo localhost:27017
use mydb;//创建数据库
db.dropDatabase();//删除当前数据库
show dbs;//查询所有数据库
db;//查询当前所在的数据库
创建集合的方式
创建集合有两种方式1.显示创建
db.createCollection("person")
2.隐式创建
db.c1.insert({name:"haiou",desc:"baji"})//创建c1集合,同时插入数据
//显示当前数据库中的所有集合
show collections;//显示person,c1和system.indexes
或show tables;
for(var i=0;i<100000;i++){
db.person.insert({name:"liguannan",age:i});
}
db.person.find();//显示所有的记录(命令行中只会显示20条记录)
db.person.find().count();//统计记录数
db.person.findOne();//查询第一条记录
db.person.find({age:19});//条件查询:查询age=19的记录
db.person.find({age:19},{name:1});//过滤字段:结果只显示name列
db.person.remove({age:19});//删除
db.person.find().skip(1).limit(10);//分页:从1开始,前10条
xx.sort({age:-1});//按照age降序:-1表示降序,1表示升序
java连接mongodb
applicationContext.xml
<!-- 引入mongo的配置文件 -->
<import resource="mongo-config.xml"/>
mongo-config.xml
<!-- 配置mongo实例 -->
<mongo:mongo host="localhost" port="27017" />
<!-- Offers convenience methods and automatic mapping between MongoDB JSON
documents and your domain classes. -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg name="databaseName" value="foobar" />
</bean>
实体类User.java
package com.yihaomen.mongodb.domain;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document
public class User implements Serializable{
private static final long serialVersionUID = 1L;
@Id
String uid;
String name;
int age;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "{USER:{uid:"+this.uid+",name:"+this.name+",age:"+this.age+"}}";
}
}
UserServiceImpl.java
@Service(value = "userService")
public class UserServiceImpl implements UserService{
private static String USER_COLLECTION = "User";
@Autowired
MongoTemplate mongoTemplate;
public void saveUser(User user){
mongoTemplate.save(user);
}
public User findUserByName(String name){
return mongoTemplate.findOne(new Query(Criteria.where("name").is(name)), User.class);
}
public User findFirst(Query query) {
return mongoTemplate.findOne(query, User.class);
}
public List<User> findUser(Class<User> entriclass) {
return mongoTemplate.findAll(entriclass);
}
public List<User> findUs(Query query, Class<User> entriclass) {
return mongoTemplate.find(query, entriclass);
}
public User findUserById(String id,Class<User> entityClass) {
return mongoTemplate.findById(id, entityClass);
}
public void deleteUser(User user) {
mongoTemplate.remove(user);
}
public void deleteAll(String ids) {
String id[] = ids.split(",");
for (int i = 0; i < id.length; i++) {
User us = mongoTemplate.findById(id[i], User.class);
mongoTemplate.remove(us);
}
}
public void deleteByIn(String ids) {
List<String> interests = new ArrayList<String>();
String id[] = ids.split(",");
for (int i = 0; i < id.length; i++) {
interests.add(id[i]);
}
Query query = new Query();
Criteria criteria = Criteria.where("uid").in(ids);
query.addCriteria(criteria);
mongoTemplate.remove(query, User.class);
}
public void update(Query query,Update update) {
mongoTemplate.findAndModify(query, update, User.class);
}
}
持久层直接注入MongoTemplate模板即可使用其封装的方法。
save()
find()
findOne()
findById()
findAll()
remove()
findAndModify()
Mongo数据库的备份和恢复
Mongo数据库的备份使用的命令是mongodump,数据库的恢复使用的命令是mongorestore命令。例如,我们要备份
mongodump -h localhost:27017 -d foobar -o f:/mongoBackup
上面 的命令表示的意思是:将本地的foobar数据库备份到F盘符下的mongoBackup目录下。
现在我们可以将数据删掉(db.dropDatabases()),然后使用恢复命令将数据恢复。
mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:Mongo所在服务器的地址
-d:需要恢复的数据库实例,例如,test,当然这个名称也可以和备份的时候不一样,比如test2
-dirctoryperdb:备份数据库所在的位置,例如:c:\data\dump\test
Mongo数据库的导入与导出
Mongo数据库的导出与导入分别使用的命令是mongoexport和mongoimport。导出:
导出数据可以使用命令:
mongoexport -h dbhost -d dbname -c collectionName -o output
参数说明:
-h 数据库地址
-d 指明使用的库
-c 指明要导出的集合
-o 指明要导出的文件名
mongoexport -h localhost:27017 -d foobar -c user -o F://mongoExport.txt
上面命令表示的意思是:将foobar数据库中的user集合导出到F:\mongoExport.txt(也可以导出为word,excel等)
导出的文件打开后格式如下:
{ "_id" : "66", "_class" : "com.yihaomen.mongodb.domain.User", "name" : "66", "age" : 66 }
{ "_id" : "88", "_class" : "com.yihaomen.mongodb.domain.User", "name" : "88", "age" : 88 }
{ "_id" : { "$oid" : "55dfb5a5880b548e0df8ef9f" }, "uid" : 1, "name" : "lisi", "age" : 18 }
{ "_id" : { "$oid" : "55dfb5b5880b548e0df8efa0" }, "uid" : 2, "name" : "wangwu", "age" : 19 }
{ "_id" : { "$oid" : "55dfb5c4880b548e0df8efa1" }, "age" : 21, "name" : "zhangsan", "uid" : 3 }
导入:
导入数据可以使用命令:
mongoimport -h dbhost -d dbname -c collectionname 文件的地址...
参数说明:
-h 数据库地址
-d 指明使用的库
-c 指明要导入的集合
本地的文件地址...
安全认证
每个MongoDB实例中的数据库都可以有许多用户。如果开启了安全性检查,则只有数据库的认证用户才能执行读或者写操作。在认证的上下文中,MongoDB会将普通的数据作为admin数据库处理。admin数据库中的用户被视为超级用户(即管理员)。
在认证之后,管理员可以读写所有数据库,执行特定的管理命令,如listDatabases和shutdown。在开启安全检查之前,一定要至少有一个管理员账号。
在admin数据库中创建管理员账号:
use admin;
db.addUser(“root”,”root”);
在test数据库中创建普通账号:
use test;
db.addUser(“zhangsan”,”123”);
db.addUser(“lisi”,”123”,true);
注意:用户zhangsan,密码为123,对test数据库拥有读写权限
用户lisi,密码为123,对test数据库拥有只读权限
重新启动数据库服务,并开启安全检查:
mongod --dbpath d:\mongo_data --auth
集群
主从复制(主从集群 )为了方便演示,可以在一台计算机上来模拟主节点和从节点。在D盘创建两个目录master和slave,master目录作为主节点的数据文件的目录,slave目录作为从节点的数据文件的目录。
注意:主节点和从节点要指定不同的端口。
启动主节点:mongod --dbpath d:\master --port 10000 --master
启动从节点:mongod --dbpath d:\slave --port 10001 --slave --source localhost:10000
启动成功后就可以连接主节点进行操作了,而这些操作会同步到从节点。
副本集
副本集就是有自动故障恢复功能的主从集群。
主从集群和副本集最大的区别就是副本集没有固定的“主节点”;整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为“主节点”,副本集总有一个活跃点(primary)和一个或多个备份节点(secondary)。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
分布式存储
Spring整合Mongodb
文档:
http://docs.spring.io/spring-data/data-document/docs/