mongodb之增删改查
概述
该类是emessage自定义的一个类,用于对mongodb进行操作,可以对mongodb进行插入,修改与删除。该类是一个单例
方法
构造方法
该类主要用来设置一些连接参数,与设置用户名和密码(如果需要),并获取对应的数据库
private MongoManager() {
//这里设置了MongoClient连接池的各种配置
MongoClientOptions options = MongoClientOptions.builder()
.connectionsPerHost(MongoConfig.connectionsPerHost)
.maxWaitTime(MongoConfig.maxWaitTime)
.socketTimeout(MongoConfig.socketTimeout)
.maxConnectionLifeTime(MongoConfig.maxConnectionLifeTime)
.connectTimeout(MongoConfig.connectTimeout).build();
//使用身份验证a
if(MongoConfig.authentication.equals("1")){
//createMongoCRCredential是使用身份验证的方法
List<MongoCredential> lstCredentials = Arrays.asList(MongoCredential.createMongoCRCredential(
MongoConfig.username, "emessage", MongoConfig.password.toCharArray()));
//通过传入lstCredentials来传入身份验证
mg = new MongoClient(new ServerAddress(MongoConfig.host,MongoConfig.port),lstCredentials,options);
}else{
mg = new MongoClient(new ServerAddress(MongoConfig.host,MongoConfig.port),options);
}
//获取对应的数据库
mongoDatabase = mg.getDatabase("emessage");
}
getInstance方法
public static MongoManager getInstance() {
if(instance==null){
int ret = MongoConfig.loadMongoConfig();
if (0 != ret) {
return null;
}else{
instance = new MongoManager();
instance.initMongo();
}
}
return instance;
}
该方法控制该类是一个单例,如果ret=0,则读取配置文件正常,initMongo,则是获取对应数据库中的所有集合。
该方法获取一个MongoManager对象,并获取对应数据库中的所有集合
initMongo方法
private void initMongo(){
MongoCollection<Document> collection = mongoDatabase.getCollection(MongoColl.HISTORYMSG.text);
}
表示获取MongoColl.HISTORYMSG.text数据库中的所有集合
getCollection(MongoColl mongoColl)方法
通过传入的集合名获取给定的集合
public MongoCollection<Document> getCollection(MongoColl mongoColl) {
//获取给定的集合
MongoCollection<Document> collection = mongoDatabase.getCollection(mongoColl.text);
return collection;
}
向mongodb添加数据
向数据库对应的集合中插入一条数据
public void insertDocument(MongoColl mongoColl,Document document){
MongoCollection<Document> coll = getCollection(mongoColl);
//向数据库中插入一条数据
coll.insertOne(document);
}
应用
插入一条数据
Document document = new Document();
document.put("name", "wyj");
document.put("sex", "1");
MongoManager m = MongoManager.getInstance();
m.insertDocument(MongoManager.MongoColl.HISTORYMSG, document);
public static enum MongoColl {
HISTORYMSG("emessage"), HISTORYMSGRESENTLY("historymsgresently"),SOCIALHISTORYMSGRIGHT("social_historymsgright");
private final String text;
private MongoColl(final String text){
this.text=text;
}
public String getText(){
return text ;
}
}
批量插入数据
public void insertDocuments(MongoColl mongoColl,List<Document> documents){
MongoCollection<Document> coll = getCollection(mongoColl);
coll.insertMany(documents);
}
应用
public void insert(){
MongoManager mongoManager = MongoManager.getInstance();
List<Document> list = new ArrayList<>();
String name = "huye";
String age = "";
for (int i=0; i<10; i++){
Document document = new Document();
age = String.valueOf(10+Math.random()*20);
document.put("name",name);
document.put("age",age);
list.add(document);
}
//批量插入
mongoManager.insertDocuments(MongoManager.MongoColl.HISTORYMSG,list);
}
更新mongodb中的数据
public UpdateResult update(MongoColl mongoColl,Bson filter,Bson update){
MongoCollection<Document> coll = mongoDatabase.getCollection(mongoColl.text);
coll.updateMany(filter, update) ;
return coll.updateMany(filter, update);
}
应用
public void update(){
MongoManager mongoManager = MongoManager.getInstance();
//这里讲包含name字段的数据,有sex就将sex修改为"sex" : { "sex" : "1" },没有改字段则新加一个改字段
//Document document = new Document("$set",new Document("sex",new Document("sex","1")));
//UpdateResult updateResult = mongoManager.update(MongoManager.MongoColl.HISTORYMSG,Filters.exists("name",true),document);
//这里讲sex的内容修改为222
Document document = new Document("$set",new Document("sex","222"));
UpdateResult updateResult = mongoManager.update(MongoManager.MongoColl.HISTORYMSG,Filters.exists("name",true),document);
System.out.println("修改值的数目:"+updateResult.getUpsertedId());
}
更新操作符
Java中可以通过updateOne,updateMany,replaceOne方法进行集合的文档更新。但是 _id 是不能更新的
updateOne只会更新一条数据,即使通过Filters.lt("age", 20)过滤出多条数据,也只会取出一条进行更新
名称 | 描述 |
---|---|
$inc | 增加一个指定值 |
$mul | 乘以一个指定值 |
$rename | 重命名 |
$setOnInsert | 更新操作对现有的文档没有影响,而是新插入了一个文档,则在这新插入的文档中加上指定字段 |
$set | 修改值 |
$unset | 删除文档中指定字段 |
$min | 更新文档中小于指定值的字段 |
$max | 更新文档中大于指定值的字段 |
$currentDate | 设置当前时间,日期或者时间戳 |
$set
只修改指定字段值,当字段不存在时,则在该文档中添加一个新的字段并赋值
doc.updateOne(Filters.eq("age", 20), new Document("$set",new Document("sex",2222)));
FindIterable
iter1.forEach(new Block
public void apply(Document _doc) {
System.out.println(_doc.toJson());
}
});
$inc
对指定字段进行增量增加,当字段不存在时,则在该文档中添加字段并赋值
doc.updateOne(Filters.eq("name", "张三"), new Document("$inc",new Document("age",10)));
FindIterable
iter.forEach(new Block
public void apply(Document _doc) {
System.out.println(_doc.toJson());
}
});
$mul
$mul的用法与$inc的用法差不多,差别在于$mul为相乘,$inc为相加,若字段不存在,添加字段并赋值为0
$rename
修改document的字段名
doc.updateOne(Filters.eq("name", "张三"), new Document("$rename",new Document("phone","telPhone")));
FindIterable
iter.forEach(new Block
public void apply(Document _doc) {
System.out.println(_doc.toJson());
}
});
删除mongodb中的数据
public DeleteResult remove(MongoColl mongoColl, Bson filter) {
MongoCollection<Document> coll = mongoDatabase.getCollection(mongoColl.text);
return coll.deleteMany(filter);
}
应用
public void remove(){
MongoManager mongoManager = MongoManager.getInstance();
DeleteResult deleteResult = mongoManager.remove(MongoManager.MongoColl.HISTORYMSG,Filters.eq("name","huye"));
System.out.println("删除数据条数:"+deleteResult.getDeletedCount());
}
查找数据
public MongoCursor<Document> find(MongoColl mongoColl, Bson filter) {
//通过传入的集合名找到对应的集合
MongoCollection<Document> coll = mongoDatabase.getCollection(mongoColl.text);
//通过传入的filter,来查找集合内对应的内容
return coll.find(filter).iterator();
}
//表示按照Bson字段排序,取值为Sorts.ascending(_id):表示按照_id字段升序
//limit:表示显示几列数据
public MongoCursor<Document> find(MongoColl mongoColl, Bson filter,Bson sort,int limit) {
MongoCollection<Document> coll = mongoDatabase.getCollection(mongoColl.text);
return coll.find(filter).sort(sort).limit(limit).iterator() ;
}
应用
public void find(){
MongoManager mongoManager = MongoManager.getInstance();
// 该类通过排序来查找对应的数据
// Sorts.ascending(_id):表示按照_id字段升序
// 2:表示显示两列数据
String _id = "_id";
//MongoCursor mongoCursor = MongoManager.getInstance().find(MongoManager.MongoColl.HISTORYMSG,Filters.eq("name","wyj"), Sorts.ascending(_id),2);
//查询字段名为name的所有内容,true:表示包含有字段名为name的值,false表示不包含有字段名为name的值
MongoCursor mongoCursor = mongoManager.find(MongoManager.MongoColl.HISTORYMSG,Filters.exists("name",false));
while(mongoCursor.hasNext()){
Document document = (Document) mongoCursor.next();
System.out.println(document.toString());
}
}