以下是使用 Java 对 MongoDB 进行增删改查操作以及复杂查询案例分析:
一、添加依赖
在 Maven 项目中添加 MongoDB Java 驱动依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.10.1</version>
</dependency>
二、连接 MongoDB 数据库
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
public class MongoApp {
public static void main(String[] args) {
// 创建 MongoDB 客户端连接
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
// 获取数据库
MongoDatabase database = mongoClient.getDatabase("yourDatabaseName");
}
}
三、插入数据(Insert)
- 插入单个文档:
import org.bson.Document; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 插入单个文档 Document userDoc = new Document("name", "Tom") .append("age", 28) .append("email", "tom@example.com"); database.getCollection("users").insertOne(userDoc); } }
- 插入多个文档:
import org.bson.Document; import java.util.ArrayList; import java.util.List; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 插入多个文档 Document user1 = new Document("name", "Jerry") .append("age", 25) .append("email", "jerry@example.com"); Document user2 = new Document("name", "Lucy") .append("age", 32) .append("email", "lucy@example.com"); List<Document> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); database.getCollection("users").insertMany(userList); } }
四、删除数据(Delete)
- 删除单个文档:
import org.bson.Document; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 删除单个文档 database.getCollection("users").deleteOne(new Document("name", "Tom")); } }
- 删除多个文档:
import org.bson.Document; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 删除多个文档 database.getCollection("users").deleteMany(new Document("age", { $gt: 30 })); } }
五、更新数据(Update)
- 更新单个文档的部分字段:
import org.bson.Document; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 更新单个文档的部分字段 database.getCollection("users").updateOne(new Document("name", "Jerry"), new Document("$set", new Document("age", 26))); } }
- 更新多个文档的部分字段:
import org.bson.Document; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 更新多个文档的部分字段 database.getCollection("users").updateMany(new Document(), new Document("$set", new Document("email", new Document("$replaceAll", new Document("input", "$email").append("find", "@example.com").append("replace", "@newdomain.com"))))); } }
六、查询数据(Find)
- 基本查询:
import org.bson.Document; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 基本查询 FindIterable<Document> allUsers = database.getCollection("users").find(); MongoCursor<Document> cursor = allUsers.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); } } }
- 投影查询(只返回指定字段):
import org.bson.Document; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 投影查询 FindIterable<Document> userNamesAndAges = database.getCollection("users").find(new Document(), new Document("name", 1).append("age", 1)); MongoCursor<Document> cursor = userNamesAndAges.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); } } }
七、复杂查询案例分析
- 多条件查询:假设我们有一个商品集合
products
,文档包含name
、category
、price
、stock
等字段。我们要查询特定类别(如 “电子产品”)且价格在某个区间(如 100 到 500)并且有库存的商品。import org.bson.Document; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 多条件查询 FindIterable<Document> productsQuery = database.getCollection("products").find(new Document("category", "电子产品").append("price", new Document("$gte", 100).append("$lte", 500).append("stock", new Document("$gt", 0))); MongoCursor<Document> cursor = productsQuery.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); } } }
- 排序和分页查询:假设我们要查询商品集合,按照价格降序排列,每页显示 10 个商品,获取第二页的内容。
import org.bson.Document; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; import com.mongodb.client.model.Sorts; import com.mongodb.client.model.SkipLimit; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 排序和分页查询 FindIterable<Document> sortedAndPaginatedProducts = database.getCollection("products").find().sort(Sorts.descending("price")).skip(10).limit(10); MongoCursor<Document> cursor = sortedAndPaginatedProducts.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); } } }
- 聚合查询(复杂数据分析):假设我们想统计每个类别下的商品数量以及平均价格。
import org.bson.Document; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.AggregateIterable; import com.mongodb.client.MongoCursor; public class MongoApp { public static void main(String[] args) { // 创建 MongoDB 客户端连接和获取数据库(如上述代码) // 聚合查询 MongoCollection<Document> collection = database.getCollection("products"); AggregateIterable<Document> categoryStats = collection.aggregate( java.util.Arrays.asList( new Document("$group", new Document("_id", "$category").append("count", new Document("$sum", 1)).append("averagePrice", new Document("$avg", "$price"))) ); MongoCursor<Document> cursor = categoryStats.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); } } }