摘要:MongoDB
记录Java操作MongoDB的常用操作,包括以下几种场景
- 查看数据库集合信息
- 查询操作:
find
,Filters
,countDocuments
- 插入操作:
insertOne
,insertMany
- 删除操作:
deleteOne
,deleteMany
- 修改操作:
updateOne
,updateMany
- 批量操作,有则更新无则插入:
bulkWrite
,ReplaceOneModel
- 单例模式
引入依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.0</version>
</dependency>
查看MongoDB数据库信息
构造MongoClient
对象,指定连接IP和端口,调用listDatabaseNames
输出数据库,构造MongoDatabase
对象,调用listCollectionNames
输出集合名
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost", 27017);
for (String db : client.listDatabaseNames()) {
System.out.println(db);
};
MongoDatabase db = client.getDatabase("test");
for (String dbName : db.listCollectionNames()) {
System.out.println(dbName);
}
client.close();
}
}
查询操作
(1)简单查询
对MongoCollection
对象调用find
方法返回FindIterable
结果集,遍历每一个元素get
获得对应的key值
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
FindIterable<Document> documents = collection.find().limit(5);
for (Document document : documents) {
System.out.println(document.getInteger("score"));
}
client.close();
}
}
(2)条件查询
在find下加入Filters
表达式就可以条件查询,比如Filters.eq
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
// Bson转字典
FindIterable<Document> findIterable = collection.find(Filters.eq( "industry", "M")).limit(5);
for (Document document: findIterable) {
System.out.println(document.get("industry") + "," + document.getString("formatted_ent_name"));
}
}
}
其他条件查询比如in查询Filters.in
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
String[] inArray = new String[] {"C", "M"};
FindIterable<Document> findIterable = collection.find(Filters.in( "industry", inArray)).limit(5);
for (Document document: findIterable) {
System.out.println(document.get("industry") + "," + document.getString("formatted_ent_name"));
}
}
}
(3)组合条件查询
多条件组合在find中增加与或非方法,比如Filters.and
,Filters.or
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
FindIterable<Document> document = collection.find(Filters.and(
Filters.eq("formatted_ent_name", "太仓市瑞弘源商贸有限公司"),
Filters.eq("inputtime", "2021-01-30")));
for (Document doc : document) {
System.out.println(doc.getInteger("score"));
}
}
}
(4)其他查询
查询满足过滤条件的数据量,调用集合的countDocuments
方法
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
long total = collection.countDocuments(Filters.eq("formatted_ent_name", "太仓市瑞弘源商贸有限公司"));
System.out.println(total);
}
}
插入操作
插入操作需要实例化Document
对象,调用append
方法构建key, values,调用集合的insertOne
插入Document对象
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
Document document = new Document()
.append("_id", "fffffe9735205006bd99776776e32a9b_2021-07-07")
.append("formatted_ent_name", "一只小狗公司")
.append("score", 92)
.append("grade", "等级1")
.append("rank_industry", 20)
.append("rank_industry_percent", 13)
.append("industry", "M")
.append("inputtime", "2021-07-01");
collection.insertOne(document);
client.close();
}
}
Document对象也可以调用put
方法在实例化之后构建数据
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
Document document = new Document();
document.put("_id", "fffffe9735205006bd99776776e32a9b_2021-07-08");
document.put("formatted_ent_name", "一只小狗公司");
document.put("score", 92);
document.put("grade", "等级1");
document.put("rank_industry", 20);
document.put("rank_industry_percent", 13);
document.put("industry", "M");
document.put("inputtime", "2021-07-01");
collection.insertOne(document);
client.close();
}
}
批次插入使用insertMany
,例子如下
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.nio.file.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
// 读取txt文件
List<String> res = Files.lines(Paths.get("src/main/resources/insertManyTest.txt")).collect(Collectors.toList());
List<Document> list = new ArrayList<>();
for (String line : res) {
if (!line.isEmpty()) {
String[] items = line.split(",");
list.add(new Document()
.append("_id", items[0])
.append("formatted_ent_name", items[1])
.append("score", Integer.parseInt(items[2]))
.append("grade", items[3])
.append("rank_industry", Integer.parseInt(items[4]))
.append("rank_industry_percent", Integer.parseInt(items[5]))
.append("industry", items[6])
.append("inputtime", items[7]));
if (list.size() == 2) {
collection.insertMany(list);
System.out.println("---------已插入一个批次:2条");
list.clear();
}
}
}
if (!list.isEmpty()) {
collection.insertMany(list);
System.out.printf("---------已插入一个批次:%s条", list.size());
list.clear();
}
client.close();
}
}
删除数据
删除数据调用集合的deleteOne
和deleteMany
,前者删除一条符合要求的数据,后者对于满足条件的数据全部删除,例子代码先执行deleteOne再deleteMany,符合要求的数据量分别是367->366->0
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
System.out.println(collection.countDocuments(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b")));
collection.deleteOne(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b"));
System.out.println(collection.countDocuments(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b")));
collection.deleteMany(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b"));
System.out.println(collection.countDocuments(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b")));
client.close();
}
}
修改数据
更新数据调用集合的updateOne
,updateMany
,前者修改满足过滤条件的1条,后者对于满足条件的数据全部修改,修改需要指定过滤条件和新的文档表达式,需要配置$
操作符,比如使用$set
修改某个key的值
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
public class Main {
public static void main(String[] args) {
MongoClient client = new MongoClient("localhost");
MongoDatabase db = client.getDatabase("test");
MongoCollection<Document> collection = db.getCollection("pira_score");
collection.updateOne(Filters.eq("formatted_ent_name", "苏州天艺江南文化发展有限公司"),
new Document("$set", new Document("industry", "E")));
client.close();
}
}
把deleteOne改为deleteMany就可以全部修改
批量操作bulkWrite
对集合调用bulkWrite
可以进行批量操作,常用的是结合ReplaceOneModel
实现批量有则更新,无则插入,实例化ReplaceOneModel并添加到列表中,bulkWrite接受任务列表,例子中文档采用自定义_id,根据_id字段进行判断,有则更新整条文档,无则直接插入
public void batchReplaceApp(List<MyModel> Samples) {
List<ReplaceOneModel<Document>> list = new ArrayList<>();
for (MyModel myModel : samples) {
String entName = myModel.getEntName();
String entRelName = myModel.getEntRelName();
String _id = MD5Utils.MD5(entName + "," + entRelName);
Document replaceDocument = new Document();
replaceDocument.put("_id", _id);
replaceDocument.put("entname", entName);
replaceDocument.put("shortname", entRelName);
replaceDocument.put("inputtime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
ReplaceOneModel<Document> replaceOneModel = new ReplaceOneModel<Document>(Filters.eq("_id", _id), replaceDocument);
list.add(replaceOneModel);
if (list.size() == 200) {
mongoCollection.bulkWrite(list);
LOGGER.info("---------修改mongo全称简称表,已完成{}", list.size());
list.clear();
}
}
if (!list.isEmpty()) {
mongoCollection.bulkWrite(list);
LOGGER.info("---------修改mongo全称简称表,已完成{}", list.size());
list.clear();
}
}
单例模式
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.ReplaceOneModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.bson.Document;
import java.util.ArrayList;
import java.util.List;
public class MongoHandler {
private static MongoHandler instance;
private static Logger LOGGER = LoggerFactory.getLogger(MongoHandler.class);
private MongoClient mongoClient;
private MongoDatabase mongoDatabase;
private MongoCollection<Document> mongoCollection;
private MongoHandler() {
LOGGER.info("实例化Mongo链接对象:{}", "xx.xx.xx.xx");
mongoClient = new MongoClient("xx.xx.xx.xx");
mongoDatabase = mongoClient.getDatabase("xx");
mongoCollection = mongoDatabase.getCollection("xx");
}
public static MongoHandler getInstance() {
if (instance == null) {
synchronized (MongoHandler.class) {
if (instance == null) {
instance = new MongoHandler();
}
}
}
return instance;
}
public void close() {
if (mongoClient != null) {
try {
mongoClient.close();
} catch (Exception e) {
LOGGER.info("关闭mongo连接报错");
}
}
}
public void test(String shortName) {
FindIterable<Document> findIterable = mongoCollection.find(Filters.eq( "shortname", shortName));
for (Document document: findIterable) {
System.out.println(document.get("entname"));
System.out.println(document.get("shortname"));
}
}
public static void main(String[] args) {
MongoHandler.getInstance().test("广汽本田");
MongoHandler.getInstance().close();
}
}
网友评论