0、前置工作
创建Maven工程,导入依赖:
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.7</version> </dependency>
1、连接MongoDB并测试
注意:确保已经启动MongoDB,最好是把MongoDB设置为自启程序。
//连接MongoDB服务器,自带连接池效果 MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017"); //获取数据库,如果数据库不存在,为该数据库存储数据时自动创建数据库。 MongoDatabase database = mongoClient.getDatabase("test"); //获取集合,如果集合不存在,首次存储数据时,自动创建集合 MongoCollection<Document> collection = database.getCollection("teachers"); //获取数据,获取集合中第一个文档,并转为json打印 System.out.println(collection.find().first().toJson()); //测试 //关闭客户端 if (mongoClient != null){ mongoClient.close(); }
如果有用户名和密码的话,连接的地址应该修改为:
mongodb://username:password@host/?authSource=admin
2、Java 操作集合
2.1、创建集合
创建集合有多种方式:创建普通的集合,创建固定大小的集合(capped)、创建带校验规则的集合:
1、创建普通集合
/** * 创建无限定集合 * @param name 集合名称 */ public void createCollection(String name){ database.createCollection(name); }
2、创建固定大小的集合
/** * 创建固定大小的集合 * @param name 集合名称 * @param size 集合大小 */ public void createCollection(String name,long size){ database.createCollection(name,new CreateCollectionOptions().capped(true).sizeInBytes(size)); }
3、创建带校验规则的集合
/** * 创建带校验规则的集合 * 在插入文档时必须存在两个字段:existsFiledName1和existsFiledName2 * @param name 集合名称 * @param existsFiledName1 字段1 * @param existsFiledName2 字段2 */ public void createCollectionWithFilter(String name,String existsFiledName1,String existsFiledName2){ ValidationOptions validationOptions = new ValidationOptions().validator( Filters.or(Filters.exists(existsFiledName1), Filters.exists(existsFiledName2)) ); database.createCollection(name,new CreateCollectionOptions().validationOptions(validationOptions)); }
2.2、获取集合
public MongoCollection<Document> getCollection(String name){ return database.getCollection(name); }
2.3、删除集合
/** * 删除集合 */ public void dropCollection(String collectionName){ MongoCollection<Document> collection = getCollection(collectionName); collection.drop(); }
3、Java 操作文档
3.1、插入单个文档
/** * 插入一个文档 * 创建一个文档对象,参数可以接收键值对,也可以直接接收一个Map对象 * 文档对象的本质是BSON类型,还类型对应java中的Map,BSON数组对应Java中的List * Document.append(String key,Object value); 键指的是字段名 值可以是字符串可以是Document对象或者List数组 */ public void insertDocument(String collectionName,Map<String,Object> map){ Document doc = new Document(); for (String key : map.keySet()) { doc.append(key,map.get(key)); } MongoCollection<Document> collection = getCollection(collectionName); collection.insertOne(doc); }
3.2、插入多个文档
/** * 插入多个文档 */ public void insertDocuments(String collectionName,List<Document> documents){ MongoCollection<Document> collection = getCollection(collectionName); collection.insertMany(documents); }
3.3、修改单个文档
这里用的是 Filters.eq() 相当于判断是否等于,如果有数值型的字段,可以用Filters.lt() 表示小于、Filters.gt() 表示大于...
/** * * @param collectionName 集合名称 * @param conditionFiledName 查询条件字段名 * @param value 查询条件字段对应的值 * @param updateList 更新后的字段键值对列表 注意:这里需要传入一个List<Document>集合,其中,Document对象的key应该为"$set",值为新的Document对象 */ public void updateDocument(String collectionName,String conditionFiledName,String value,List<Document> updateList){ MongoCollection<Document> collection = getCollection(collectionName); collection.updateOne(Filters.eq(conditionFiledName,value),updateList); }
3.4、修改多个文档
//修改多个文档 所有订单数量<100的订单全部+1 MongoCollection<Document> collection = getCollection("orders"); //给满足条件的订单的订单数目全部+100 UpdateResult updateResult = collection.updateMany(Filters.eq("order_nums",100), Updates.inc("order_nums", 100)); System.out.println(updateResult.getModifiedCount());
3.5、删除文档
//删除单个条件文档 MongoCollection<Document> collection = getCollection("orders"); collection.deleteOne(Filters.eq("order_id","0003")); //删除多个满足条件文档 collection.deleteOne(Filters.eq("order_num","100"));
4、Java 查询文档
4.1、查询所有文档
MongoCollection<Document> collection = getCollection("students"); //查询所有文档 MongoCursor<Document> cursor = collection.find().iterator(); // MongoCursor<Document> cursor = collection.find().limit(100);//只看前100行 // MongoCursor<Document> cursor = collection.find().first();//只看第一行 try { while (cursor.hasNext()) { System.out.println(cursor.next().toJson()); } }finally { cursor.close(); }
4.2、条件查询
主要依靠Filters类进行拦截过滤。
//多条件查询 60<=score<80 并且 address="山西"(如果address是数组,则"山西"包含在内即可) FindIterable<Document> documents = collection.find( new Document("score", new Document("$gte", 60) .append("$lt", 80)) .append("address", "山西") ); //等价于上面的 collection.find(Filters.and( Filters.gte("score",60), Filters.lt("score",80), Filters.eq("address","山西")));
4.3、投影
投影就是选择展示的字段,因为默认是全部展示的。即使设置了想要展示的字段,"_id"字段也会被展示,需要用专门指定"_id"为0或者使用 Projections.excludeId()。
//投影 collection.find( Filters.eq("name","李大喜") ).projection(new Document("name",1) .append("sex",1) .append("age",1) .append("_id",0) ); //等价于上面的投影 Projections.excludeId() 不展示 _id collection.find( Filters.eq("name","李大喜")) .projection(Projections.fields(Projections.include("name","sex","age"),Projections.excludeId()));
4.4、排序
//排序 先按照年龄排序 年龄一样的安照工资排序 //asc 升序 //desc 降序 collection.find(Filters.lt("age",50)) .sort(Sorts.ascending("age","sal"));